为什么Visual Studio C ++甚至需要在不需要它的文件中包含“StdAfx.h”?

时间:2017-01-18 02:32:13

标签: c++ visual-studio-2012 visual-studio-2015 precompiled-headers stdafx.h

我理解预编译的头文件正在使用“#include”StdAfx.h“并且是的,我知道我可以关闭它们。但这不是我的问题。

如果您正在使用预编译头文件,则Visual C ++需要每个 cpp文件#include“StdAfx.h”,甚至是不使用StdAfx.h中任何头文件的文件。如果您忘记在一个文件中包含StdAfx.h,则会出错。但为什么?显而易见的方法就是“如果你包含StdAfx.h,那么该文件将使用它,但是如果你忘记包含它,那么那些头文件就不会被包含在内。”我不明白为什么VC ++会要求你在不需要的时候包含StdAfx.h。似乎它们更容易像普通的头文件一样对待它。

有什么理由需要这个吗?

3 个答案:

答案 0 :(得分:10)

只是Marks答案的补充。实际上,您不必在所有项目源文件中手动包含stdafx.h。您可以使用项目选项Forced Include Files:  enter image description here

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

答案 1 :(得分:9)

您的项目默认为"使用预编译的标题"。您可以将单个文件设置为"不使用预编译的标题"如果你愿意的话。

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

enter image description here

这个配置说的是"开始编译这个文件(stdafx.cpp),当你完成编译包含stdafx.h的语句时停止"并将预编译的信息保存为.pch文件。" Visual Studio也足够智能,可以先编译该文件,以便可以使用。

项目默认值为:

enter image description here

这个配置说的是"对于每个编译的文件,从指定的.pch中的预编译数据开始,并在包括stdafx.h之后开始编译新信息。& #34;这很重要,为什么stdafx.h应作为文件的第一行包含在内。如果你稍后将它放在文件中,它仍然可以工作,但#include之前的任何内容都会被忽略,因为这些数据不会出现在.pch中。没有#include意味着VS将扫描整个文件,寻找预编译的起始位置而不是找到它......产生错误。

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

enter image description here

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

答案 2 :(得分:0)

选择文件后,右键单击属性,转到“ C / C ++ \ Precompiled标头”部分,并将“ Precompiled标头”设置为“不使用预编译标头”,请确保配置(左上方)为适用于当前选定的版本。

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