头文件中的预编译头文件

15

今天我第一次接触预编译头文件,它改变了我的生活。我无法相信编译C++代码可以如此快速。现在这完全有意义了。

无论如何,有一件让我困惑的事情是,从我到目前为止所读到的内容来看,预编译头文件只应该添加到源文件(cpp?)中。

在Visual Studio中,项目属性-> C/C++->高级选项下有一个名为"Force Include File"的选项。我将编译器选项设置为stdafx.h

这样做后,我不再需要包含已添加到stdafx.h中的头文件,甚至不需要在我的头文件中包含它们(源文件应自动包含stdafx.h)。这是预期的行为吗?

我找不到一个清晰区分头文件/源文件的地方。

如果是这样,那太好了,但我担心这是VC++让你得逞但在GCC中会出错的另一种情况。是的,它需要可移植性,至少在GCC和VC++之间。


1
如果你想让你的项目在gcc上也能工作,那么最好不要使用“强制包含文件”选项。样板文件是将源代码文件中的第一个#include指向预编译头文件。 - Hans Passant
2
@Hans,相应的gcc功能是使用-include命令行选项,在每个文件的开头包含stdafx.h - Rob Kennedy
3个回答

22

StdAfx.h应该只包含在源文件中,而不是头文件中。建议您在每个cpp文件中首先#include "StdAfx.h",而不要使用“强制包含文件”选项。这是我在我的跨平台项目中的做法。值得一提的是,在GCC中,我实际上并没有使用预编译头文件,而是正常构建,并且运行良好。

为了一些背景知识。编译器只查看源文件(例如*.cpp、*.c等),因此当它编译它们时,必须包括每个头文件并编译头文件中找到的任何代码。预编译头文件选项允许将所有该项代码(即在StdAfx.h中全局包含的代码)编译一次,以便您不必每次都进行编译。这就是StdAfx.cpp的作用。编译器将StdAfx.cpp与StdAfx.h中所有包含的代码一起编译一次,而不是每次构建时都要这样做。

因此,由于您在每个源文件中都将StdAfx.h作为第一个项目包含,所以在任何头文件中包含它是没有意义的,因为它们将在StdAfx.h之后被包含,因此将可以访问StdAfx.h中的所有代码。此外,您还可以在其他项目中使用这些头文件,而不必担心是否有StdAfx.h存在或包含了错误的StdAfx.h。


我的问题是VC++是否会自动将它们添加到头文件中?当我使用未包含但在stdafx.h中的类型时,不会出现错误..非常奇怪。 - irwinb
3
不,"force include"选项会将文件添加到每个源代码/Cpp文件的第一行。 #include的工作原理是将要包含的文件内容放置到源文件中# include的位置。使用“force include”选项,这将使得每个CPP文件在顶部都有您的StdAfx.h的内容,然后是所有头文件和源代码的内容(按照文件中的任意顺序)。因此,效果是:在该项目的头文件中可以使用StdAfx.h中定义的所有内容。编译器只查看源文件而不是头文件。 - syplex
哦,我明白了。那很有道理。谢谢你解释这个。 - irwinb

6
是的,这是预期行为。项目属性→C/C++→高级设置中的“强制包含文件”控制Visual C++编译器选项/FI:(英文文档)

该选项与在每个源文件的第一行使用双引号指定文件的#include指令具有相同的效果。

所以,它使您免于手动包含stdafx.h。
虽然,您可以使用GCC和其他编译器进行预编译头文件,但Visual C++的快捷行为在其他编译器中不可移植。因此,请参阅如何在跨平台代码中处理stdafx.h?,其中讨论了便携式解决方案的想法。
长话短说,在.cpp源文件中手动包含stdafx.h,您也应该使用GCC(假设您将配置构建使用预编译头文件)。

将广告添加到 .h 和 .cpp 文件中吗? - irwinb
如果它只添加到.cpp文件中,为什么VC++允许我在头文件中声明这些类型而不包含它们? - irwinb
@irwinb 你可以在stdafx.h中添加通用头文件,适用于Visual C++和GCC。然后在你的.cpp文件中包含stdafx.h。但是,如果你只使用VC++,那么你可以使用/FI选项指定stdafx.h,请求编译器自动为你包含此头文件。 - mloskot

3
不要使用“强制包含文件”设置(/FI),因为它会破坏编辑和继续功能!(而微软似乎不想解决这个问题)

See https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h" 应该只出现在源文件的第一行非注释行,而不是头文件中。


2
MS Connect已经停用,VS2019中的许多Edit & Continue错误已经修复,但对于这个问题不确定。 - Laurie Stearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接