我理解预编译的头文件正在使用"#include"StdAfx.h"并且是的,我知道我可以关闭它们.但这不是我的问题.
如果您使用预编译头文件,Visual C++要求每个 cpp文件#include"StdAfx.h",甚至是不使用StdAfx.h中任何头文件的文件.如果您忘记在一个文件中包含StdAfx.h,则会出错.但为什么?显而易见的方法就是"如果你包含StdAfx.h,那么该文件将使用它,但如果你忘记包含它,那么这些头文件就不会被包含在内." 我不明白为什么VC++会要求你在不需要的时候包含StdAfx.h.似乎它们更容易像普通的头文件一样对待它.
有什么理由需要这个吗?
您的项目默认为"使用预编译头".如果需要,可以将单个文件设置为"不使用预编译头".
实际上,stdafx.cpp
它本身与项目默认值有不同的选择:
这个配置说的是"开始编译这个文件(stdafx.cpp),当你完成编译包含stdafx.h的语句时停止"并将预编译的信息保存为.pch文件."Visual studio也足够聪明地编译这个文件首先是可以使用的.
项目默认为:
这个配置说的是"对于每个编译的文件,从指定的.pch中的预编译数据开始,并在包含stdafx.h 之后开始编译新信息." 这很重要,为什么stdafx.h应作为文件的第一行包含在内.如果你稍后将它放在文件中,它仍然可以工作,但#include之前的任何内容都会被忽略,因为该数据不会出现在.pch中.没有#include意味着VS将扫描整个文件,寻找预编译的起始位置而不是找到它......产生错误.
如果您有一个不想使用预编译信息的文件,则可以选择该文件并覆盖它.例:
Visual Studio不会使用预编译的信息,也不会查找要包含的标头.
只是马克斯答案的补充.实际上,您不必手动包含stdafx.h
在所有项目源文件中.您可以使用项目选项Forced Include Files
:
这种方式stdafx.h
将自动包含在您的所有来源中.