Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么Visual Studio C++;要求包括;StdAfx.h“;即使在不使用';你不需要吗?_C++_Visual Studio 2012_Visual Studio 2015_Precompiled Headers_Stdafx.h - Fatal编程技术网

C++ 为什么Visual Studio C++;要求包括;StdAfx.h“;即使在不使用';你不需要吗?

C++ 为什么Visual Studio C++;要求包括;StdAfx.h“;即使在不使用';你不需要吗?,c++,visual-studio-2012,visual-studio-2015,precompiled-headers,stdafx.h,C++,Visual Studio 2012,Visual Studio 2015,Precompiled Headers,Stdafx.h,我知道预编译头文件如何处理“#include”StdAfx.h”,是的,我知道我可以关闭它们。但这不是我的问题 如果使用预编译头,VisualC++需要每个CPP文件包含“STDAFX.H”,甚至在STDAFX.h中没有使用任何报头的文件。如果忘记在一个文件上包含STDAFX.H,则是一个错误。但是为什么?显而易见的方法是“如果您包含STDAFX.H,那么该文件将使用它,但是如果你忘了包含它,那么这些头文件就不会被包含进去。“我不明白为什么VC++会要求你在不需要的时候包含StdAfx.h。似乎

我知道预编译头文件如何处理“#include”StdAfx.h”,是的,我知道我可以关闭它们。但这不是我的问题

如果使用预编译头,VisualC++需要每个CPP文件包含“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
。您可以使用项目选项“强制包含文件”:


这样,
stdafx.h
将自动包含在所有源代码中。

选择文件时,右键单击属性,转到“C/C++\Precompiled Headers”部分,并将“Precompiled Header”设置为“Not using Precompiled Headers”,确保配置(左上角)适用于当前选定的生成


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

预编译头的全部目的是缩短编译时间。如果要做任何额外的检查,这将增加编译时间,使得预编译头的唯一好处——无用。你为什么这么说?不需要额外检查——VC++只需执行“如果第一行是#include“stdafx.h”,然后将这些符号复制到其中;否则什么也不做”。看起来微软这样做会更容易,对用户来说也更明显。事实上,不需要在每个文件上都使用“StdAfx.h”实际上会提高编译时间,因为这样就不需要将那些预编译的符号复制到不需要它们的.cpp文件上。@user2543623:“如果第一行是#include”StdAfx.h“然后把那些符号复制到那里;但在其他情况下什么也不做“您假设预编译头必须被称为”stdafx.h“。项目实际上可以有多个单独的预编译头;每个源文件都可以指定它使用的PCH。不要混淆典型项目生成器提供的默认值和编译器可以做的全部工作。选择创建一个空项目,否则每次都需要包含stdafx.h。从技术上讲,它不会回答OPs问题,因为他在问题的第一句话中说了这一点:是的,我知道我可以关闭它们。但这不是我的问题。我知道,我正在编辑。我不在电脑前,想要一些截图。加上OP可能不知道你可以单独关闭它们,这就是我的观点。引用OP:[ Visual C++要求每一个CPP文件包含“STDAFX.H”),而不是。@ AlgRdDasPrID.IIUS,你假设原始海报知道他可以关闭特定文件而不是整个项目。我的经验告诉我,大多数人不知道这一点,也不知道如何去做。我和拥有高级学位的人一起工作,他们已经使用这些工具超过十年了,但他们并不知道这一点。他是否知道这一点还不清楚。马克提供了有用的信息。真正的答案是,“因为微软这么说。”好吧,你可以在单个文件上关闭StdAfx.h,但是为什么VC++会要求你这么做呢?如果他们能够在没有stdAfx.h的情况下编译一些文件;那么为什么它不能做一件简单而明显的事情:如果包含StdAfx.h,就使用它;如果不包含它,就不使用它?这将是“关闭每个文件”最明显的方式,不是吗?这是一个合同。如果打开开关以使用预编译的头文件,则必须将stdafx.h作为第一个包含的文件。如果你不想要,就不要用它。如果您不喜欢,请使用g++或编写自己的编译器。好的一点是,如果有多个强制包含,请确保预编译头列在第一位,原因与此相同,预编译头应列在源文件中的第一位……忽略它之前的任何代码,编译器以.pch文件中的状态启动。这建议(/FI)中断编辑并继续。还是