14

我今天第一次遇到预编译的头文件……永远改变了我的生活。我不敢相信编译我的 C++ 代码会这么快。现在完全有道理了..

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

在 Visual Studio 中,在 Project Properties->C/C++->Advanced 下有一个选项可以“强制包含文件”。我将该编译器选项设置为stdafx.h

这样做之后..我不再需要包含我添加到我的stdafx.h的标题,即使在我的头文件中(源文件应该自动包含 stdafx.h )。这是预期的行为吗?

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

如果确实如此.. 很好,但我担心这是 VC++ 让你逃脱但会在 GCC 中破坏的另一件事。是的..它需要便携;至少在 GCC 和 VC++ 之间。

4

3 回答 3

19

StdAfx.h 真的应该只包含在源文件中,而不是头文件中。我建议您在每个 cpp 中首先 #include "StdAfx.h" 并且不要使用“强制包含文件”选项。这就是我对跨平台项目的处理方式。作为记录,我实际上并没有在 GCC 中使用预编译的头文件,我只是正常构建它并且它运行良好。

对于一些背景。编译器只查看源文件(即*.cpp、*.c 等),因此当它编译它们时,它必须包含每个头文件并编译在头文件中找到的任何代码。预编译头选项允许编译所有代码(即 StdAfx.h 中的全局包含代码),这样您就不必一直这样做。这就是 StdAfx.cpp 的用途。编译器使用 StdAfx.h 中包含的所有代码编译 StdAfx.cpp 一次,而不必每次构建时都这样做。

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

于 2012-07-09T21:48:48.713 回答
5

是的,这是预期的行为。Project Properties->C/C++->Advanced to "Force Include File" 设置控制Visual C++ 编译器选项 /FI

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

因此,它使您无需手动包含 stdafx.h。

虽然,您可以将预编译的头文件与 GCC 和其他编译器一起使用。Visual C++ 的快捷方式行为不能跨其他编译器移植。那么,检查如何在跨平台代码中处理 stdafx.h?讨论便携式解决方案的想法。

长话短说,在您的 .cpp 源文件中手动包含 stdafx.h 并且您应该也可以使用 GCC(假设您将为 GCC 配置您的构建以使用预编译头文件)。

于 2012-07-09T21:26:29.730 回答
2

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

请参阅 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"只能作为源文件中的第一个非注释行找到,而不是在头文件中。

于 2014-05-13T12:32:27.737 回答