Включить stdafx.h в заголовок или исходный файл?
У меня есть файл заголовка stdafx.h, и этот, конечно, предварительно скомпилирован.
Я читал, что я должен включать эти файлы в мои .cpp файлы, но некоторые из этих операторов уже нужны в файле заголовка, приходящем с этим.
Должен ли я добавить stdafx в свой заголовок или в мой cpp? Я думал, что это хорошая практика, чтобы поместить его в заголовок, но мне кажется, что он обязан помещать его в заголовок вместо этого.
Пример:
stdafx содержит freeglut.
мой заголовочный файл класса имеет атрибут GLenum.
Должен ли я включать stdafx в .h класса?
Ответы
Ответ 1
stdafx.h должен быть первым включать в каждый файл cpp в вашем проекте.
Учтите, что С++ не компилирует файлы заголовков, а только файлы Cpp.
Поэтому, если stdafx является первым, включенным в файл cpp, тогда у компилятора будет все, что требуется файлу заголовка, когда он попадает в заголовочный файл в файле Cpp.
например.
У вас есть A.cpp и A.h.
A.h требует std: string.
у вас есть B.cpp и B.h
B.h нуждается в A.h, поэтому B.h также нуждается в std::string.
Потому что это хорошая практика, вы ставите #include <string>
в stdafx.h.
Сбой сборки невозможен, потому что ничего не видно std::string
Теперь поместите stafx.h как первый, включите в A.cpp и B.cpp.
Когда компилятор попадает на A.cpp, он поднимает значение для <string>
, затем выбирает A.h, и все радует, потому что мы знаем, что такое std::string.
Теперь компилятор попадает на B.cpp, он сначала включает stdafx, который приносит <string>
, а затем удаляет B.h, что приносит A.h, что снова радует, потому что std::string уже включен.
Надеюсь, что это поможет.
Ответ 2
- Включать только в свой предварительно скомпилированный заголовок, который должен быть там
- Ваш предварительно скомпилированный файл заголовка должен быть первым в каждом .cpp
- Я бы не стал включать его в другой заголовок в пользу прямого объявления
Задайте себе эти два вопроса, прежде чем включать что-то в stdafx.h
- Будет ли этот заголовок никогда не изменяться мной?
- Нужно ли это включать в
каждый несколько исходных файлов?
Если ответ "Нет" ни одному из них, не включайте его.