- Primary tabs
- Forums:
- Q: Для чего это сделано.
- Q: Почему возникает ошибка «error looking precompiled header directive».
- Q: Как избавится от генерации PCH-файлов
- Q: Где находятся эти опции
- Q: Я настроил компиляцию DEBUG-версии на отказ использования PCH, но при компиляции RELEASE ошибка опять возникла.
- 2 ответа 2
Primary tabs
![]()
Forums:
При создании нового проекта (C++, далее любой из подпроектов, типа Console App, MFC App, или ATL Service) Visual Studio генерит кучку файлов, которые составляют костяк приложения.
Кстати — при создании приложения типа Conlsole Application в Visual Studio 2010 stdafx.h содержит следующие строки =
Среди этих файлов имеются два, которые служат для генерации файла предкомпилированных заголовков (precompiled headers). Первый — stdafx.h, в нем хранятся все «основные» include-ы проекта, но, как правило, не входящие в сам проект, т.е. файлы типа=
включаются, а CSomeSuperPuperProjectClass.h — нет.
Второй — stdafx.cpp, служит как «затравка» компилятору для компиляции этого самого .pch-файла (precompiled headers file)
В свойствах проекта для всех файлов ставиться опция «use this precompiled header» и указывается stdafx.h
Исключение — stfafx.cpp, для него указывается «create precompiled header file» и, опять таки, указывается stdafx.h
Q: Для чего это сделано.
A: Все это сделано для ускорения компиляции проектов и не более того. Из-за того, что объем части общих .h-файлов превосходит все разумные пределы (например windows.h, цепляющий ещё десяток win*.h), и компилировать все эти заголовочники для каждого source-файлы просто накладно. Поэтому один раз генерится PCH-файл, а потом он (PCH) используется. Ускорение, кстати, в десятки раз, особенно заметное при работе с ATL/MFC проектами.
Q: Почему возникает ошибка «error looking precompiled header directive».
A: В каждом source-файле, для которого стоит опция «use this precompiled header» #include «stdafx.h» должно идти первым include
Q: Как избавится от генерации PCH-файлов
A: В свойствах проекта для файлов выставить «Not Using Precompiled Headers» или «Automatically Generate»
Q: Где находятся эти опции
A: VS6: Project settings -> C/C++ -> Precompiled Headers
VS.NET: Configuration Properties -> C/C++ -> Precompiled Headers
Q: Я настроил компиляцию DEBUG-версии на отказ использования PCH, но при компиляции RELEASE ошибка опять возникла.
A: Project setting для DEBUG/RELEASE представляю разные сущности. См. пред. пункт Q/A и настрой все для RELEASE-конфигурации.
Почему первый вариант записи в Microsoft Visual Studio компилирует:
а второй (более простой) нет:
Компилятор выдает ошибку
1>c:usersadmindocumentsvisual studio 2013projectsconsoleapplication1consoleapplication1consoleapplication1.cpp(4): warning C4627: ‘#include ‘: skipped when looking for precompiled header use
В чем отличие и с чем это связано?

2 ответа 2
Стандартная проблема языков, унаследовавших модульность C в виде #include — дикое время компиляции. Это связано с тем, что компилятор не может просто так скомпилировать header-файлы «про запас»: ведь то, что находится во включающем .cpp -файле до #include , может кардинально повлиять на смысл текста! (Представьте себе, например, #define void int .) Поэтому бедному компилятору приходится раз за разом перечитывать и перекомпилировать один и тот же заголовок, а также всё, что он в себя рекурсивно включает (а это могут быть десятки тысяч файлов!)
Для борьбы с этим одно из средств — предкомпилированные заголовки. Какая-то часть заголовочных файлов предкомпилируется, но чтобы корректно включить её, необходимо, чтобы она шла в самом начале .cpp-файла. Видите, почему? Потому что иначе в нём может встретиться директива, полностью меняющая смысл заголовочных файлов!
Лазер. h — это у вас надо спросить, что это за файл. Какой-то пользовательский включаемый файл, смотрите у себя в проекте, что в нем находится.
#define MAX_LOADSTRING 100 — это никакая не библиотека, а макрос. Означает, что в любом месте программы, где используется строчка «MAX_LOADSTRING», эта мнемоника будет заменена на 100.