Включение заголовка в предварительно скомпилированный заголовок и вне его в мой файл заголовка класса

Я долго искал это, но продолжаю получать ответы, которые не отвечают этому конкретному сценарию.

У меня есть класс под названием VisibleGameObject, Мне интересно, что произойдет, если я добавлю свои обычные включения в заголовок (чтобы другие разработчики могли использовать тот же класс), и добавлю это же включение в мой предварительно скомпилированный заголовок stdafx.hЯ не хочу, чтобы разработчики зависели от моего ПК.

// 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"

...

РСН:

// 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> является включенным охраняемым, так что ПК работает нормально, а мое включение игнорируется. В Visual Studio ошибкой не является включение pch первым. Я просто хочу подтвердить это поведение. Пч привыкнет нормально и нет <SFML/Graphics.hpp> код перекомпилирован?

1 ответ

Решение

Если у автора заголовка вообще есть соль, то нет, она не будет перекомпилирована.

PCH включает в себя полное определение, в том числе #ifndef, #define, #endif включить охранную логику. Во время создания PCH файл будет извлечен, скомпилирован, а идентификатор включенного охранника будет формально определен. В вашем источнике, который следует за любым #include "stdax.h" весь этот предварительно скомпилированный контент вкрадывается. Источник будет включать подозрительный заголовок для компиляции. Тем не менее, препроцессор пропустит весь контент после включения защиты #ifndef Идентификатор найден как определено. Примечание. Возможно, его можно перекомпилировать для модуля перевода, для которого PCH отключен, но я сомневаюсь, что вы это сделали.

Короче говоря, вы делаете это правильно, и ваша оценка точна.

Другие вопросы по тегам