5

Я понимаю, что прекомпилирована заголовки делают с «#include„stdafx.h“и да, я знаю, что их можно отключить. Но это не мой вопрос.Почему Visual Studio C++ требует включения «StdAfx.h» даже в файлы, которые ему не нужны?

Если вы используете скомпилированные заголовки, Visual C++ требует каждый Файл cpp для #include "StdAfx.h", даже файлы, которые не используют какие-либо заголовки в StdAfx.h. Если вы забыли включить StdAfx.h в один файл, это ошибка. Но почему? Очевидным подходом было бы просто «Если вы включите StdAfx.h, то этот файл будет использовать его, но если вы забудете включить его, то эти заголовочные файлы просто не будут включены». Я не понимаю, почему VC++ потребует от вас включая StdAfx.h, когда это не нужно. Похоже, им было бы легче рассматривать его как обычный файл заголовка.

Есть ли веская причина, почему это требуется?

+0

Весь смысл предварительно скомпилированных заголовков заключается в сокращении времени компиляции. Если какие-либо дополнительные проверки будут выполнены, это увеличит время компиляции, оказывая единственное преимущество предварительно скомпилированных заголовков - бесполезно. –

+0

Почему вы так говорите? Нет необходимости в дополнительной проверке - VC++ может просто сделать «если первая строка - #include» stdafx.h ", тогда скопируйте эти символы там, но в противном случае ничего не сделайте". Похоже, Microsoft было бы проще сделать это таким образом и более очевидным для пользователей. – user2543623

+0

Фактически, * не * требуется «StdAfx.h» для каждого файла, фактически улучшит время компиляции, так как тогда им не нужно будет копировать эти прекомпилированные символы в файлы .cpp, которые им не нужны. – user2543623

ответ

7

Ваш проект по умолчанию «использует предварительно скомпилированные заголовки». Вы можете настроить отдельные файлы на «не использовать предварительно скомпилированные заголовки», если хотите.

В самом деле, stdafx.cpp сама по себе имеет другой вариант из проекта по умолчанию:

enter image description here

Что эта конфигурация сказать, «начать составление этого файла (stdafx.cpp), останавливается, когда вы закончите составлять «и сохраните прекомпилированную информацию в файл .PCH» заявление, которое включает в себя stdafx.h Visual Studio также достаточно умно, чтобы скомпилировать этот файл первым так что он доступен для использования

Значение по умолчанию проекта:.

enter image description here

Что эта конфигурация говорит это «для каждого скомпилированного файла, начните с скомпилированными данными в указанном .PCH и начать собирать новую информацию после точки stdafx.h входит.» Это важно и почему stdafx.h должен быть включен как первая строка файла. Он по-прежнему будет работать, если вы поместите его позже в файл, но ничего, кроме #include, игнорируется, потому что эти данные не будут находиться в .pch. Отсутствие средства #include означает, что VS сканирует весь файл, ищущий предварительно скомпилированное исходное местоположение, а не обнаруживает его ... генерирует ошибку.

Если у вас есть файл, который вы не хотите использовать предварительно скомпилированную информацию, вы можете выбрать файл и переопределить его. Пример:

enter image description here

Visual Studio не будет использовать прекомпилированную информацию и не будет искать заголовок включить.

+0

Технически, это не ** отвечает на вопрос ОП, так как он заявил об этом в первом предложении своего вопроса: «Я знаю, что могу отключить их. Но это не мой вопрос. –

+2

Я знаю, я работаю над редактированием. Я не был перед моим компьютером и хотел несколько скриншотов. Плюс OP может не знать, что вы можете * индивидуально * отключить их, что было моим моментом. Чтобы процитировать OP: [Visual C++ требует * каждый * cpp-файл для #include "StdAfx.h"], и это не так. –

+1

@ AlgirdasPreidžius Ну, вы предполагаете, что оригинальный плакат знает, что он может отключить его для определенных файлов, а не для всего проекта. Мой опыт говорит мне, что большинство людей этого не знают и как это сделать. Я работаю с людьми с высшим образованием, которые используют инструменты уже более десяти лет, и они этого не знают. Знает ли он это или нет, неясно. Марк дал полезную информацию. реальный ответ: «потому что Microsoft заявила об этом». –

7

Просто дополнение к ответам Marks. На самом деле вам не нужно вручную включать stdafx.h во все исходные файлы проекта. Вы можете использовать опцию проекта Forced Include Files: enter image description here

Таким образом stdafx.h будут автоматически включены во всех ваших источников.

+1

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