9

我了解预编译的标头对 "#include "StdAfx.h" 的作用,是的,我知道我可以将它们关闭。但这不是我的问题。

如果您使用的是预编译头文件,Visual C++ 要求每个cpp 文件都包含 #include "StdAfx.h",即使是未使用 StdAfx.h 中的任何头文件的文件。如果您忘记在一个文件中包含 StdAfx.h,这是一个错误。但为什么?显而易见的方法就是“如果您包含 StdAfx.h,那么该文件将使用它,但如果您忘记包含它,则根本不会包含这些头文件。” 我不明白为什么 VC++ 会在不需要时要求您包含 StdAfx.h。似乎他们更容易将其视为普通头文件。

有什么好的理由需要这样做吗?

4

3 回答 3

12

只是对 Marks 答案的补充。事实上,您不必手动包含stdafx.h在所有项目源文件中。您可以使用项目选项Forced Include Files在此处输入图像描述

这种方式stdafx.h将自动包含在您的所有来源中。

于 2017-01-18T03:19:24.850 回答
11

您的项目默认设置为“使用预编译头文件”。如果您愿意,可以将单个文件设置为“不使用预编译头文件”。

事实上,stdafx.cpp它本身有一个与项目默认值不同的选项:

在此处输入图像描述

这个配置的意思是“开始编译这个文件(stdafx.cpp),当你完成编译包含stdafx.h的语句时停止”并将预编译信息保存为.pch文件。”Visual Studio也很聪明,可以编译此文件首先可供使用。

项目默认值为:

在此处输入图像描述

这个配置的意思是“对于每个编译的文件,从指定的.pch中的预编译数据开始,在包含点stdafx.h之后开始编译新的信息。” 这很重要,为什么 stdafx.h 应该作为文件的第一行包含在内。如果您稍后将它放在文件中,它仍然可以工作,但#include 之前的任何内容都会被忽略,因为该数据不会在 .pch 中。缺少 #include 意味着 VS 将扫描整个文件以查找预编译的起始位置并且找不到它......生成错误。

如果您有一个不想使用预编译信息的文件,您可以选择该文件并覆盖它。例子:

在此处输入图像描述

Visual Studio 不会使用预编译信息,也不会查找要包含的标头。

于 2017-01-18T02:52:27.563 回答
0

选择文件后,右键属性,进入“C/C++\Precompiled Headers”部分,将“Precompiled Header”设置为“Not using Precompiled Headers”,确保配置(左上角)适用于当前选定的构建。

它并不总是自动选择“活动”配置;因此您可以为非活动配置设置选项,这样您将继续遇到错误;)

于 2018-09-19T10:27:41.407 回答