在我的类头文件中包括预编译头文件中的标头及其外部

时间:2014-06-12 05:53:00

标签: c++ include precompiled-headers

我已经搜索了一段时间,但我一直得到的答案没有回答这个具体情况。

我有一个名为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>代码?

1 个答案:

答案 0 :(得分:2)

如果标题的作者有任何盐,那么不,它将不会被重新编译。

PCH包含完整定义,包括#ifndef, #define, #endif包含保护逻辑。在PCH创建期间,文件将被拉入,编译,并且正式定义包含保护标识符。所有#include "stdax.h"所有预编译内容都被包含在您的源代码中。源包含用于编译的可疑标头。但是,一旦根据定义找到包含警卫#ifndef id,预处理器将跳过所有内容。注意: 可以为具有PCH关闭 off 的翻译单元重新编译,但我怀疑你是否已经这样做了。

简而言之,您正确地做到了,并且您的评估是准确的。