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

Впервые я столкнулся с прекомпилированными заголовками в первый раз... перед тем, как изменить свою жизнь. Я не могу поверить, что мой код на С++ может быть таким быстрым. Теперь он имеет общий смысл.

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

В Visual Studio есть опция в разделе "Свойства проекта" → "C/С++ → " Дополнительно "для" Включить файл ". Я установил этот параметр компилятора в stdafx.h.

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

Я не могу найти место, которое очищается в различие между заголовками/исходными файлами.

Если это действительно так..., но я боюсь, что это еще одна из тех вещей, которые VС++ позволяет вам уйти, но переломит GCC. И да... он должен быть портативным; по крайней мере, между GCC и VС++.

Ответ 1

StdAfx.h действительно должен быть включен только в исходные файлы, а не в заголовки. Я бы предложил вам # включить "StdAfx.h" сначала в каждом cpp и не использовать параметр "Force Include File". То, как я это делаю с помощью своих кросс-платформенных проектов. Для записи я фактически не использую предварительно скомпилированные заголовки в GCC. Я просто строю его нормально и хорошо работает.

Для некоторого фона. Компилятор просматривает только исходные файлы (т.е. *.cpp, *.c и т.д.), Поэтому, когда он компилирует их, он должен включать каждый заголовок и компилировать любой код, найденный в заголовках. Опция precompiled headers позволяет компилировать весь этот код (т.е. Глобально включаемый код в StdAfx.h) один раз, так что вам не нужно делать это все время. Для чего предназначен StdAfx.cpp. Компилятор компилирует StdAfx.cpp со всем кодом, включенным в StdAfx.h, вместо того, чтобы делать это каждый раз при сборке.

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

Ответ 2

Да, это ожидаемое поведение. Элементы Project Properties- > C/С++ → Advanced для "Force Include File" Опция компилятора Visual С++/FI:

Эта опция имеет тот же эффект, что и указание файла с двойным кавычки в директиве #include на первой строке каждого исходный файл

Таким образом, он освобождает вас от включения stdafx.h вручную.

Хотя вы можете использовать предварительно скомпилированные заголовки с GCC и другими компиляторами Поведение ярлыка Visual С++ не переносимо для других компиляторов. Итак, проверьте Как обрабатывать stdafx.h в кросс-платформенном коде?, где обсуждаются идеи для портативных решений.

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

Ответ 3

Не используйте параметр "Force Include File" (/FI), поскольку он прерывает Edit и Continue! (и MS, похоже, не хочет исправлять эту проблему)

См https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

и https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h" должен быть найден только в первой строке без комментариев в исходных файлах, а не в файлах заголовков.