在我的班级头文件中的预编译头中包含头,以及在其外部

Mr_Moneybags

我已经搜索了一段时间,但是我一直得到的答案不能解决这个特定的情况。

我有一堂课叫做VisibleGameObject我想知道如果我将常规包含包含在标头中(以便其他开发人员可以使用相同的类),并且将相同包含包含在我的预编译标头中stdafx.h会发生什么,我不想让开发人员依赖于我的pch。

// VisibleGameObject.h

#pragma once
#include "SFML\Graphics.hpp"
#include <string>

class VisibleGameObject
{
public:
    VisibleGameObject();
    virtual ~VisibleGameObject();

    virtual void Load( std::string filename );
    virtual void Draw( sf::RenderWindow & window );

    virtual void SetPosition( float x, float y );

private:
    sf::Sprite  _sprite;
    sf::Image _image;
    std::string _filename;
    bool _isLoaded;
};

实施:

// VisibleGameObject.cpp
#include "stdafx.h"
#include "VisibleGameObject.h"

...

PCH:

// stdafx.h
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>


// TODO: reference additional headers your program requires here
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>

当我构建项目时(编译一次之后),#include <SFML/Graphics.hpp>每次都会重新编译吗?因为它包含在此类的头文件中。我认为发生的情况是,pch首先包含在cpp文件的翻译单元中,然后#include <SFML/Graphics.hpp>被包括保护,因此pch可以正常工作,而我的include被忽略了。在Visual Studio中,不首先包含pch是错误的。我只想确认这种行为。pch是否可以正常使用并且没有<SFML/Graphics.hpp>重新编译代码?

WhozCraig

如果标题的作者根本不加任何盐,则不会,它不会被重新编译。

PCH包含完整定义,包括#ifndef, #define, #endif包含保护逻辑。在PCH创建期间,将拉入,编译文件,并正式定义包含保护标志。在您的源#include "stdax.h"代码中将包含所有预编译的内容。源代码中将包含用于编译的可疑标头。但是,一旦#ifndef找到了定义的包含保护的ID ,预处理器将跳过所有内容注:这可能的,可以重新编译为一个翻译单元,具体地PCH关,但我怀疑你做到这一点。

简而言之,您做得正确,您的评估是准确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果标头已经包含在预编译的标头中,我应该继续在源文件中包含标头吗?

删除包含在预编译头文件中的内容的优点?

我什么时候想在Visual Studio中关闭“预编译头文件”?

macOS中的CMake,预编译的头文件(.pch)支持

预编译的头文件中的错误C2512?

VS总是寻找预编译的头文件

强制 CMake 重建预编译头文件

Xcode无法发出预编译头文件?

对于干净的构建,预编译的头文件是否可以比经典包含的文件慢?

预编译的标头和常规包含

预编译头-从所有其他文件中删除所有预编译头所必需

gcc预编译头文件:pragma出现在主文件中

禁用单个文件的预编译头

如何在其他类头文件中包含类头文件

为什么不能在Visual Studio中禁用预编译头文件?

在ESP IDF编译器中包含头文件

使用xctool指定预编译的头文件目录

由于循环条件,无法发出预编译的头文件

xcode项目中预编译的头文件在什么地方?

Visual Studios,在 C 代码中使用预编译头文件

设置一个可以预编译和不预编译头文件的项目

在终端和 VS 代码中编译多个 .c 文件(并正确包含头文件)。我这样做正确吗?

使用在其外部线程中更新的arrayList值

正确的方式包含与预编译的二进制文件和手动编译的二进制文件不同的头文件

编译目标文件时如何不创建预编译头?

需要两次包含预编译头

错误:“-x 预编译头”中的值“预编译头”无效

无法发出用于桥接头文件的预编译头文件

Qt最佳实践包括头文件和预编译头文件?