Подтвердить что ты не робот

Включить stdafx.h в заголовок или исходный файл?

У меня есть файл заголовка stdafx.h, и этот, конечно, предварительно скомпилирован. Я читал, что я должен включать эти файлы в мои .cpp файлы, но некоторые из этих операторов уже нужны в файле заголовка, приходящем с этим.

Должен ли я добавить stdafx в свой заголовок или в мой cpp? Я думал, что это хорошая практика, чтобы поместить его в заголовок, но мне кажется, что он обязан помещать его в заголовок вместо этого.

Пример:

stdafx содержит freeglut.
мой заголовочный файл класса имеет атрибут GLenum.

Должен ли я включать stdafx в .h класса?

4b9b3361

Ответ 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

  • Будет ли этот заголовок никогда не изменяться мной?
  • Нужно ли это включать в каждый несколько исходных файлов?

Если ответ "Нет" ни одному из них, не включайте его.