Предварительно скомпилированные заголовки
У меня есть пример проекта (не мой), который находится в Visual C++ 6. Я пытаюсь преобразовать его в Visual Studio 2008.
Более старый проект использует предварительно скомпилированные заголовки. Теперь вопросы:
Что такое предварительно скомпилированные заголовки?
Поскольку старый проект использует предварительно скомпилированные заголовки. Я также буду использовать их в Visual Studio 2008 (новый проект). Но я получаю сообщение об ошибке: "Вы забыли включить stdafx.h", чтобы устранить проблему, я включаю "stdafx.h" в каждый исходный файл. Это сработало отлично. Но старый проект не включал "stdafx.h" в каждый файл? Тогда как я могу отказаться от включения "stdafx.h" в каждый исходный файл. Поскольку не каждому исходному файлу нужны включаемые файлы, определенные в "stdafx.h", это делают только немногие. Как это сделать?
РЕДАКТИРОВАТЬ: КАК ИСКЛЮЧИТЬ НЕКОТОРЫЕ ФАЙЛЫ ИЗ ИСПОЛЬЗОВАНИЯ ПРЕДВАРИТЕЛЬНОГО ЗАГОЛОВКА?
3 ответа
Что такое предварительно скомпилированные заголовки?
Часто исходные файлы C++ включают заголовки из внешних библиотек. В Windows вы включаете windows.h
, Эти заголовочные файлы могут быть очень большими, и для их обработки требуется некоторое время. Каждый раз, когда вы компилируете файл C++, компилятор должен прочитать и обработать тысячи строк из этих заголовочных файлов. Но внешние библиотеки не меняются, и вы можете сэкономить много времени, если обработаете эти файлы только один раз и сохраните результат.
Предварительно скомпилированный заголовок - это просто набор файлов заголовков, которые были обработаны до промежуточной формы, которая позднее может использоваться компилятором снова и снова.
Предварительно скомпилированные заголовки в Visual C++
В Visual C++ принято #include
все ваши неизменяемые заголовочные файлы в stdafx.h
, Затем вы указываете компилятору создать предварительно скомпилированный заголовок stdafx.pch
во время компиляции stdafx.cpp
который ничего не делает, кроме как включает stdafx.h
, Если вы хотите использовать предварительно скомпилированный заголовок в другом .cpp
файл, который вы должны включить stdafx.h
в качестве первого включаемого файла и указать компилятору использовать stdafx.pch
для вашего предварительно скомпилированного заголовка.
Если вы получили сообщение об ошибке, не включив stdafx.h
Вы просто должны указать компилятору не использовать предварительно скомпилированный заголовок для этого конкретного исходного файла. (Или вы можете включить stdafx.h
.)
Предварительно скомпилированные настройки заголовка для отдельных исходных файлов
Visual C++ позволяет управлять настройками компилятора для всего проекта и для отдельных файлов. Чтобы получить доступ к отдельным свойствам, выберите исходный файл в обозревателе решений, щелкните его правой кнопкой мыши и выберите " Свойства" в контекстном меню. Параметры для предварительно скомпилированных заголовков находятся в разделе "Свойства конфигурации => C / C++ =>" Предварительно скомпилированные заголовки ". Если вы изменяете эти настройки, вы часто захотите сделать это для всех конфигураций (например, Debug and Release).
Когда вы используете предварительно скомпилированные заголовки, у вас будет настройка для всего проекта, которая инструктирует компилятору использовать stdafx.pch
для предварительно скомпилированного заголовка. stdafx.cpp
будет иметь индивидуальные настройки, которые инструктируют компилятор генерировать stdafx.pch
и если у вас есть некоторые исходные файлы, которые не включают stdafx.h
Вы можете установить индивидуальные настройки для них, чтобы не использовать предварительно скомпилированные заголовки.
Когда вы компилируете код, компилятор должен просмотреть все заголовки #included, чтобы узнать, как скомпилировать код в вашем файле.cpp.
В больших проектах (или в тех, которые используют библиотеки, такие как MFC) эти заголовки могут стать огромными, и, следовательно, их компиляция займет много времени.
Поскольку большинство этих заголовков не меняются так часто (если вообще когда-либо), вы можете заставить компилятор "прекомпилировать" их - он обрабатывает их и сохраняет свое состояние в предварительно скомпилированном заголовке. В следующий раз, когда он скомпилируется, ему не нужно снова читать и компилировать все эти заголовки, так что это намного быстрее.
Одним из требований в Visual Studio является то, что если вы используете предварительно скомпилированный заголовок, он должен быть включен в каждый файл проекта.
Если проект небольшой или вы не часто его строите, то вы можете просто отключить опцию "предварительно скомпилированный заголовок" (в настройках проекта. Это относится ко всему проекту). Единственный эффект, который вы получите, это то, что он может компилироваться медленнее. Или оставьте этот параметр включенным и просто добавьте #include "stdafx.h" в качестве первого включения в каждый файл.
- Смотрите MSDN
- Обычно. вам нужно включить "stdafx.h" в каждый файл cpp. Все дело в том, что они предварительно скомпилированы, и вам не нужно беспокоиться о том, что не все они используются в каком-то конкретном файле.