Включение заголовка в предварительно скомпилированный заголовок и вне его в мой файл заголовка класса
Я долго искал это, но продолжаю получать ответы, которые не отвечают этому конкретному сценарию.
У меня есть класс под названием 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 отключен, но я сомневаюсь, что вы это сделали.
Короче говоря, вы делаете это правильно, и ваша оценка точна.