Почему не включить stdafx.h недостаточно для VisualStudio?
Я понимаю, что цель предварительно скомпилированного заголовка собирается ускорить процесс компиляции с помощью объектного файла, который уже был скомпилирован один раз, и связать его с реальным проектом. Но я не понимаю, почему я должен явно применять Visual Studio для использования stdafx.h
(Особенности проекта -> C/C++ -> Предварительно скомпилированные заголовки -> Предварительно скомпилированные заголовки)? Почему нет #include "stdafx.h"
недостаточно?
2 ответа
Так называемый stdafx.h
должен выглядеть как обычный заголовочный файл. В его названии нет ничего особенного. Не предполагается автоматически включать предварительно скомпилированные заголовки.
Идея в том, что stdafx.h
будет выглядеть как обычный заголовочный файл любым другим компилятором и / или когда вам не нужно использовать заголовки прекомпилятора в MSVC.
Именно вы должны сообщить компилятору MSVC, что вы действительно хотите включить предварительно скомпилированные заголовки. Именно поэтому у вас есть этот проект настройки. И только когда вы включаете предварительно скомпилированные заголовки, stdafx.h
получит свою особую роль и получит специальную обработку от компилятора. И это не обязательно stdafx.h
, Вы можете назначить эту особую роль любому другому заголовку, указав другое имя в настройках проекта.
На самом деле, увидеть ссылку на AFX в проекте, который не имеет ничего общего со специфическими для Microsoft библиотеками или фреймворками, было бы довольно странно.
Почему нет
#include "stdafx.h"
[...] довольно?
Потому что это просто стандартная директива препроцессора C++. * Это ничем не отличается от #include <string>
что касается компилятора. Если вам нужно добавить дополнительную семантику, вы должны сообщить об этом компилятору.
Поскольку существует путаница в том, как Visual Studio реализует предварительно скомпилированные заголовки, вот ссылка на документацию: Создание предварительно скомпилированных файлов заголовков.
* Имейте в виду, нет ничего особенного в названии "stdafx.h"
кроме того, что это имя заголовка по умолчанию, используемое для генерации PCH.
На вопрос, можно ли безопасно использовать предварительно скомпилированный заголовок, непросто ответить. Предположим, ваш заголовок имеет
#ifndef FOO
void foo();
#endif
Теперь предположим, что вы прекомпилируете этот заголовок.
В другом исходном файле ничто не мешает вам определить FOO
перед включением заголовка. Если вы это сделаете, предварительно скомпилированный заголовок не должен использоваться, но единственный способ, которым компилятор может знать, - это если он отслеживает каждый макрос, который используется где-либо в заголовках.
Это много работы. GCC делает это, но Microsoft решила не делать этого.
Гораздо проще сказать, что предварительно скомпилированные заголовки разрешены только в нескольких конкретных сценариях, и, если большие варианты использования охватываются этими несколькими конкретными сценариями, этого достаточно.