Что в "stdafx.h " используется в Visual Studio?

файл с именем stdafx.h создается автоматически при запуске проекта в Visual Studio 2010. Мне нужно создать кросс-платформенную библиотеку C++, поэтому я не могу использовать этот файл заголовка.

что это stdafx.h используется? Нормально ли, что я просто удаляю этот файл заголовка?

3 ответов


у всех компиляторов C++ есть одна серьезная проблема с производительностью. Компиляция кода на C++ - долгий и медленный процесс.

компиляция заголовков, включенных поверх файлов c++, является очень долгий, медленный процесс. Компиляция огромных структур заголовков, которые являются частью Windows API и других больших библиотек API, является очень, очень долгий, медленный процесс. Чтобы сделать это снова, и снова, и снова для каждого исходного файла Cpp-это смерть дурное предзнаменование.

это не уникально для Windows, но старая проблема, с которой сталкиваются все компиляторы, которые должны компилироваться против большого API, такого как Windows.

компилятор Microsoft может улучшить эту проблему с помощью простого трюка под названием предварительно скомпилированные заголовки. Трюк довольно скользкий: хотя каждый файл CPP может потенциально и юридически дать sligthly разное значение цепочке файлов заголовков, включенных поверх каждого файла Cpp (такими вещами, как наличие разных макросов #define'D заранее включает или включает заголовки в другом порядке), что чаще всего не так. В большинстве случаев у нас есть десятки или сотни включенных файлов, но все они имеют одинаковое значение для всех файлов Cpp, компилируемых в вашем приложении.

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

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

Просто перечислите все ваши большие огромные заголовки для ваших API в вашем stdafx.H файл, в соответствующем порядке, а затем запустите каждый из ваших файлов CPP в самом верху с #include "stdafx.h", перед любым содержательным содержанием (как раз о единственной вещи позволенной раньше Примечание.)

при таких условиях вместо запуска С нуля компилятор начинает компилировать из уже сохраненных результатов компиляции все stdafx.h.

Я не считаю, что этот трюк уникален для компиляторов Microsoft, и я не думаю, что это была оригинальная разработка.

для компиляторов Microsoft параметр, управляющий использованием предварительно скомпилированных заголовков, управляется аргументом командной строки для компилятора:/Yu "stdafx.h". Как вы можете себе представить, использование stdafx.h имя файла-это просто Соглашение; вы можете изменить имя, если хотите.

в Visual Studio 2010 этот параметр управляется из GUI с помощью щелчка правой кнопкой мыши по проекту CPP, выбора " свойства "и перехода к"свойства конфигурации\C/C++\предварительно скомпилированные заголовки". Для других версий Visual Studio расположение в GUI будет отличаться.

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

если вы создаете библиотеку без зависимостей Windows, вы можете легко комментировать или удалять #includes из stdafx.H-файл. Нет необходимости удалять файл как таковой, но, очевидно, вы можете сделать это, отключив параметр заголовка precompile выше.


Это "предварительно скомпилированный файл заголовка" -- любые заголовки, которые вы включаете в stdafx.h предварительно обрабатываются для экономии времени во время последующих компиляций. Вы можете прочитать больше об этом здесь на MSDN.

Если вы создаете кросс-платформенное приложение, установите флажок "пустой проект"при создании проекта, и Visual Studio не будет помещать файлы в проект.


Я просто столкнулся с этим сам, так как я пытаюсь создать себе структуру голых костей, но начал с создания новой опции программы Win32 в Visual Studio 2017. в "stdafx.ч" является излишним и должен быть удален. Затем вы можете удалить глупый " stdafx.h " и " stdafx.ЧГК", который находится в вашем обозревателе решений, а также файлы из вашего проекта. На его место, вам нужно будет положить

#include <Windows.h>

вместо.