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

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

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

Пример:

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

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


person Marnix    schedule 08.03.2011    source источник


Ответы (2)


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


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

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

e.g.

У вас есть 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>, затем выбирает Ah, и все устраивает, потому что мы знаем, что std :: string есть.

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

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

person Binary Worrier    schedule 08.03.2011
comment
Ваш комментарий о том, что C ++ не компилирует файлы заголовков, просто файлы Cpp либо не имеет смысла, либо просто неверен. Просьба уточнить. - person John Dibling; 08.03.2011
comment
@John: Я пытаюсь сказать, что компилятор никогда не будет смотреть на файл .h сам по себе, он будет смотреть только на файл .h в контексте того, где он включен в файл cpp. - person Binary Worrier; 08.03.2011
comment
Попался. В целом это правда, хотя я уверен, что вы можете заставить компилятор скомпилировать файл .H напрямую как отдельную единицу перевода. И в этом, собственно, и есть весь смысл PCH. Но когда компилятор просматривает H-файл с помощью оператора #include, он компилируется. - person John Dibling; 08.03.2011
comment
@ Джон: Я пытаюсь упростить задачу для спрашивающего. В прошлом я обнаружил, что ложь о том, что компилируются только файлы Cpp, часто оказывается полезным инструментом обучения. Это помогает людям перестать связывать себя узлами, пытаясь выяснить, почему компилятор внезапно жалуется на файл заголовка, который вчера работал отлично (например, оказывается, что они изменили порядок включения в новом модуле, однако они проводят час, глядя на в файле заголовка, а не как / что / где он включен). - person Binary Worrier; 08.03.2011
comment
Странно, что я об этом не подумал. Кажется довольно логичным, что stdafx находится перед файлом .h, поэтому он также найдет stdafx. Спасибо за полезные советы. - person Marnix; 08.03.2011
comment
Этот жирный текст. Теперь я понимаю, почему вы его не включаете. - person mouse; 02.02.2018

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

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

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

Если ответ на любой из них отрицательный, не включайте его.

person AJG85    schedule 08.03.2011