Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Компилятор Microsoft может решить эту проблему с помощью простого трюка, называемого предварительно скомпилированными заголовками. Хитрость довольно проста: хотя каждый CPP файл может потенциально и юридически придать немного другое значение цепочке заголовочных файлов, включенных в начало каждого 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 этот параметр управляется из графического интерфейса пользователя посредством щелчка правой кнопкой мыши по проекту CPP, выбора "Свойства" и перехода к "Свойства конфигурации\C/C++\Предварительно скомпилированные заголовки". Для других версий Visual Studio расположение в графическом интерфейсе будет другим.

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Я впервые столкнулся с предварительно скомпилированными заголовками с компилятором borland С++ в 1991/92 году, и я не думаю, что он тоже произошел.

- Другая разработка была /- инкрементная привязка, которая помогла уменьшить размер кода, связав только ссылочный код с исполняемым файлом.

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

Ответ 5

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

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

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017

Ответ 6

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

#include <Windows.h>

вместо.