繁体   English   中英

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

[英]Why does Visual Studio C++ require including “StdAfx.h” even on files that don't need it?

我知道使用“ #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文件。首先使用此文件,以便可以使用。

项目默认值为:

在此处输入图片说明

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

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

在此处输入图片说明

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

只是对马克答案的补充。 实际上,您不必在所有项目源文件中手动包含stdafx.h 您可以使用项目选项“ Forced Include Files 在此处输入图片说明

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM