включить stdafx.h в заголовок или исходный файл? - PullRequest
14 голосов
/ 08 марта 2011

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

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

Пример:

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

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

Ответы [ 2 ]

25 голосов
/ 08 марта 2011

stdafx.h должно быть первым включением в КАЖДЫЙ файл cpp в вашем проекте.


Учтите, что C ++ не компилируетсязаголовочные файлы, только файлы Cpp .

Поэтому, если stdafx является первым включением в файл cpp, тогда у компилятора будет все, что нужно заголовочному файлу, когда он достигнет заголовочного файла в файле Cpp .

например,

У вас есть A.cpp & Ah
А-а нуждается в std: string.

у вас есть B.cpp & Bh
Bh нужен Ah, поэтому Bh также нужен std :: string.

Поскольку это хорошая практика, вы помещаете #include <string> в stdafx.h.

Ваша сборка завершается неудачно, потому что std не видит ничего:: string

Теперь поместите stafx.h как первое включение в A.cpp и B.cpp.
Когда компилятор нажимает A.cpp, он выбирает включение для <string>, затем выбираетup Ах, и все счастливы, потому что мы знаем, что такое std :: string.

Компилятор теперь запускает B.cpp, снова он сначала включает stdafx, что приносит <string>,затем нажимает Bh, что возвращает Ah, который снова счастлив, потому что std :: string уже включен.

Надеюсь, это поможет.

6 голосов
/ 08 марта 2011
  • Включайте в предварительно скомпилированный заголовок только те вещи, которые должны быть там
  • Ваш файл скомпилированного заголовка должен быть первым включением в каждый .cpp
  • Я бы не стал включать его в другой заголовокв пользу форвардной декларации

Задайте себе эти два вопроса, прежде чем включать что-то в stdafx.h

  1. Я никогда не буду изменять этот заголовок?
  2. Нужно ли включать это в каждый файл с несколькими исходными файлами?

Если ответ «Нет» на любой из этих вопросов, не включайте его.

...