在我的类头文件中同时包含预编译头和不包含预编译头的头文件。

5

我在这方面搜索了一段时间,但一直得到的答案都没有回答这个具体的场景。

我有一个名为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正常工作,我的包含被忽略。在Visual Studio中,不包括pch会导致错误。我只是想确认这种行为。是否正常使用pch,没有重新编译任何<SFML/Graphics.hpp>代码?
1个回答

4
如果头文件的作者使用了盐(即预处理器中的随机数),那么不会重新编译。PCH(预编译头文件)包含完整的定义,包括#ifndef、#define和#endif等预处理指令。在创建PCH期间,该文件将被引入、编译并正式定义包含保护标识符。在任何#include "stdax.h"后跟随的源文件中,所有预编译内容都被吞掉了。源代码包括可疑的头文件以进行编译。然而,一旦找到包含保护标识符的#ifndef id已被定义,预处理器将跳过所有内容。注意:当特定的转换单元关闭PCH时,它可能会被重新编译,但我怀疑你没有这样做。
简而言之,您正在正确地执行操作,您的评估是准确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接