Почему Visual Studio C++ требует включения "StdAfx.h" даже для файлов, которые в этом не нуждаются?
Я понимаю, что делают скомпилированные заголовки с "#include "StdAfx.h", и да, я знаю, что могу их отключить. Но это не мой вопрос.
Если вы используете предварительно скомпилированные заголовки, Visual C++ требует, чтобы каждый файл cpp содержал #include "StdAfx.h", даже файлы, которые не используют ни один из заголовков в StdAfx.h. Если вы забыли включить StdAfx.h в один файл, это ошибка. Но почему? Очевидный подход заключается в следующем: "Если вы включите StdAfx.h, тогда этот файл будет использовать его, но если вы забудете включить его, то эти заголовочные файлы просто не будут включены". Я не понимаю, почему VC++ требует от вас включать StdAfx.h, когда он не нужен. Похоже, им было бы проще обращаться с ним как с обычным заголовочным файлом.
Есть ли веская причина, почему это требуется?
3 ответа
По умолчанию ваш проект "использовать предварительно скомпилированные заголовки". Вы можете установить отдельные файлы, чтобы "не использовать предварительно скомпилированные заголовки", если хотите.
По факту, stdafx.cpp
Сам по себе отличается от проекта по умолчанию:
Эта конфигурация говорит: "Начните компилировать этот файл (stdafx.cpp), остановитесь, когда вы закончите компилировать оператор, включающий stdafx.h", и сохраните предварительно скомпилированную информацию как файл.pch." Visual Studio также достаточно умна для компиляции этот файл первым, поэтому он доступен для использования.
Проект по умолчанию:
Эта конфигурация говорит: "Для каждого скомпилированного файла начните с предварительно скомпилированных данных в указанном.pch и начните компилировать новую информацию после включения точки stdafx.h". Это важно, и поэтому stdafx.h должен быть включен в качестве первой строки файла. Он все равно будет работать, если вы поместите его позже в файл, но все, что находится до #include, игнорируется, потому что эти данные не будут в.pch. Отсутствие #include означает, что VS будет сканировать весь файл в поисках предварительно скомпилированного начального местоположения и не найдет его... генерируя ошибку.
Если у вас есть файл, который вы не хотите использовать предварительно скомпилированную информацию, вы можете выбрать файл и переопределить его. Пример:
Visual Studio не будет использовать предварительно скомпилированную информацию и не будет искать заголовок для включения.
Когда вы выбираете файл, щелкните правой кнопкой мыши свойства, перейдите в раздел "C/C++ \ Precompiled Headers" и установите для "Precompiled Header" значение "Не использовать предварительно скомпилированные заголовки", убедитесь, что конфигурация (вверху слева) применима к текущая выбранная сборка.
Не всегда автоматически выбирается "активная" конфигурация; так что вы можете установить опцию для неактивной конфигурации, чтобы вы продолжали испытывать ошибку;)