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

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

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

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

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

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


person akif    schedule 18.08.2009    source источник


Ответы (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 и Release).

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

person Martin Liversage    schedule 18.08.2009

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

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

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

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

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

person Jason Williams    schedule 18.08.2009
comment
Неправильно, почему в MSVC6 мне не нужно включать предварительно скомпилированный заголовок в каждый файл ??? - person akif; 18.08.2009
comment
Он (Джейсон Уильямс) прав. stdafx.h не будет включаться только в те файлы, которые не используют какие-либо материалы, включенные в stdafx.h, например, файлы заголовков Windows. В противном случае, присмотритесь, stdafx.h может быть включен через какое-то другое включение косвенно. - person Aamir; 18.08.2009
comment
@Jason неверно заявляет, что [одно] одно требование в Visual Studio состоит в том, что если вы используете предварительно скомпилированный заголовок, он должен быть включен в каждый файл в проекте. Ложь. Вы можете включить или выключить отдельные файлы (отсутствие переключателя /Y); если бы вы не могли, вам было бы трудно смешивать исходные файлы C и C ++ в проекте. - person vladr; 04.04.2012

  1. См. MSDN
  2. Как правило. вам необходимо включить stdafx.h в каждый файл cpp. Все дело в том, что они предварительно скомпилированы, и вам не нужно беспокоиться, что не все из них используются в каком-то конкретном файле.
person bocco    schedule 18.08.2009