include stdafx h что это

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.

Оцените статью