我已经搜索了一段时间,但我一直得到的答案没有回答这个具体情况。
我有一个名为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;
};
Implementaion:
// 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>
代码?
答案 0 :(得分:2)
如果标题的作者有任何盐,那么不,它将不会被重新编译。
PCH包含完整定义,包括#ifndef, #define, #endif
包含保护逻辑。在PCH创建期间,文件将被拉入,编译,并且正式定义包含保护标识符。所有#include "stdax.h"
所有预编译内容都被包含在您的源代码中。源将包含用于编译的可疑标头。但是,一旦根据定义找到包含警卫#ifndef
id,预处理器将跳过所有内容。注意: 可以为具有PCH关闭 off 的翻译单元重新编译,但我怀疑你是否已经这样做了。
简而言之,您正确地做到了,并且您的评估是准确的。