Почему не включить 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 решила не делать этого.

Гораздо проще сказать, что предварительно скомпилированные заголовки разрешены только в нескольких конкретных сценариях, и, если большие варианты использования охватываются этими несколькими конкретными сценариями, этого достаточно.

Другие вопросы по тегам