Предварительно скомпилированные заголовки - программирование
Подтвердить что ты не робот

Предварительно скомпилированные заголовки

У меня есть пример проекта (не мой), который находится в Visual С++ 6. Я пытаюсь преобразовать его в Visual Studio 2008.

В более старом проекте используются предварительно скомпилированные заголовки. Теперь вопросы:

  • Что такое предварительно скомпилированные заголовки?

  • Поскольку более старый проект использует предварительно скомпилированные заголовки. Я также буду использовать их в Visual Studio 2008 (новый проект). Но я получаю ошибки, говоря, что "Забыл ли вы включить stdafx.h" , чтобы исправить проблему, я включаю "stdafx.h" в каждый исходный файл. Это сработало отлично. Но старый проект не включал "stdafx.h" в каждом файле? Тогда как я могу отказаться от включения "stdafx.h" в каждый исходный файл. Потому что не каждому исходному файлу нужны файлы include, определенные в "stdafx.h", только немногие делают. Как это делается?

РЕДАКТИРОВАТЬ: КАК Я ПРОДОЛЖАЮТ НЕКОТОРЫЕ ФАЙЛЫ ИЗ ИСПОЛЬЗОВАНИЯ ПРЕДВАРИТЕЛЬНОГО РУКОВОДИТЕЛЯ?

4b9b3361

Ответ 1

Что представляют собой предварительно скомпилированные заголовки?

Часто исходные файлы С++ включают заголовки из внешних библиотек. В Windows вы включаете windows.h. Эти файлы заголовков могут быть очень большими, и для обработки требуется некоторое время. Каждый раз, когда вы компилируете файл С++, компилятор должен читать и обрабатывать тысячи строк из этих файлов заголовков. Но внешние библиотеки не меняются, и вы можете сэкономить много времени, если вы обрабатываете эти файлы только один раз и сохраняете результат.

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

Предварительно скомпилированные заголовки в Visual С++

В Visual С++ принято #include все ваши неизменяемые файлы заголовков в stdafx.h. Затем вы инструктируете компилятор создать предварительно скомпилированный заголовок stdafx.pch при компиляции stdafx.cpp, который ничего не делает, кроме include stdafx.h. Если вы хотите использовать предварительно скомпилированный заголовок в другом файле .cpp, вы должны включить stdafx.h в качестве первого файла include и указать компилятору использовать stdafx.pch для вашего предварительно скомпилированного заголовка.

Если вы получили сообщение об ошибке, не включающей stdafx.h, вам просто нужно дать указание компилятору не использовать предварительно скомпилированный заголовок для этого конкретного исходного файла. (Или вы можете включить stdafx.h.)

Предварительно скомпилированные настройки заголовков для отдельных исходных файлов

Visual С++ позволяет вам управлять настройками компилятора для всего проекта и отдельных файлов. Для доступа к отдельным свойствам вы выбираете исходный файл в проводнике решений, щелкните его правой кнопкой мыши и выберите "Свойства" в контекстном меню. Параметры для предварительно скомпилированных заголовков находятся в Configuration Properties = > C/С++ = > Предварительно скомпилированные заголовки. Если вы измените эти параметры, вы часто захотите сделать это для всех конфигураций (например, отладка и выпуск).

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

Ответ 2

При компиляции кода компилятор должен искать во всех заголовочных заголовках #, чтобы знать, как скомпилировать код в вашем .cpp файле.

С большими проектами (или с использованием библиотек, таких как MFC) эти заголовки могут стать огромными и, таким образом, потребуется много времени для компиляции.

Поскольку большинство этих заголовков часто не изменяются (если вообще когда-либо), вы можете заставить компилятор "прекомпилировать" их - он обрабатывает их и сохраняет свое состояние в предварительно скомпилированный заголовок. В следующий раз, когда он компилируется, ему больше не нужно читать и компилировать все эти заголовки, поэтому он намного быстрее.

Одно из требований в Visual Studio заключается в том, что если вы используете предварительно скомпилированный заголовок, он должен быть включен в каждый файл в проекте.

Если проект небольшой или вы его часто не создаете, вы можете просто отключить опцию "предварительно скомпилированный заголовок" (в настройках проекта. Это относится к проекту целиком.). Единственный эффект, который вы получите, это то, что он может скомпилироваться медленнее. Или оставьте эту опцию включенной и просто добавьте #include "stdafx.h", поскольку первые включаются в каждый файл.

Ответ 3

  • См. MSDN
  • Обычно. вам нужно включить "stdafx.h" в каждый файл cpp. Все дело в том, что они предварительно скомпилированы, и вам не нужно беспокоиться о том, что не все они используются в каком-то конкретном файле.