Что в "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>
вместо.