Почему stdafx.h работает так, как он делает?

Как обычно, когда мой мозг возится с чем-то, что я не могу понять сам, я прихожу к вам, ребята, за помощью:)

На этот раз мне было интересно, почему stdafx.h работает так, как он делает? Насколько я понимаю, он делает 2 вещи:

  • Включает стандартные заголовки, которые мы может (?) использовать и которые редко меняются
  • Работа в качестве компилятора-закладки для код больше не скомпилирован.

Теперь эти две вещи кажутся мне двумя разными задачами, и мне интересно, почему они не сделали два отдельных шага, чтобы позаботиться о них? Для меня кажется разумным, чтобы команда # pragma делала закладки и, возможно, имела заголовочный файл длинными строками windows.h, чтобы включить в себя часто используемые заголовки... Что подводит меня к следующему point: Почему мы вынуждены включать часто используемые заголовки через stdafx.h? Лично я не знаю о часто используемых заголовках, которые я использую, для которых я еще не занимаюсь, но, возможно, эти заголовки необходимы для генерации .dll?

спасибо заранее

Ответ 1

stdafx.h - ОДИН способ использования Visual Studio для прекомпилированных заголовков. Это простой в использовании, легко автоматически генерируемый подход, который хорошо подходит для небольших приложений, но может создавать проблемы для более сложных приложений, в которых тот факт, что он поощряет эффективное использование одного файла заголовка, может вызвать связь между компонентами, которые в противном случае независимы. Если для заголовков системы используется просто, он имеет тенденцию быть в порядке, но по мере того, как проект растет по размеру и сложности, возникает соблазн бросить туда другие заголовки, а затем внезапно изменить любой заголовочный файл приводит к перекомпиляции всего в проекта.

Смотрите здесь: Есть ли способ использовать предварительно скомпилированные заголовки в VС++ без требования stdafx.h? для деталей альтернативного подхода.

Ответ 2

Вы не должны использовать "stdafx.h". Вы можете проверить использование предварительно скомпилированных заголовков в свойствах проекта (или при создании проекта), и вам больше не понадобится stdafx.h.

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

Ответ 3

Сохраняет время компиляции, так как материал в нем всегда скомпилирован сначала (см. подробности в цитате ниже):

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

Совместимые компиляторы будут предварительно скомпилируйте этот файл, чтобы уменьшить общее время компиляции. Visual С++ будет не компилировать ничего перед #include "stdafx.h" в исходном файле, если параметр компиляции /Yu 'stdafx.h 'не отмечен (по по умолчанию); он принимает весь код в источник до и включая эту строку уже скомпилирован.

Ответ 4

Это поможет сократить длинные компиляции.