头文件中的预编译头

时间:2012-07-09 21:10:11

标签: c++ visual-studio visual-c++ gcc precompiled-headers

我今天第一次遇到预编译的标题。在改变我的生活之前。我无法相信编译我的C ++代码可能会那么快。它现在很有意义..

无论如何,令我困惑的一件事是,从我到目前为止所读到的,预编译的标题只应添加到源文件(cpp?)。

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

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

我无法找到标题/源文件之间区别的地方。

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

3 个答案:

答案 0 :(得分:16)

StdAfx.h确实应该只包含在源文件中,而不是标题中。我建议你在每个cpp中首先#include“StdAfx.h”而不要使用“Force Include File”选项。多数民众赞成我如何使用我的跨平台项目。为了记录,我实际上并没有在GCC中使用预编译的头文件我只是正常构建并且它运行良好。

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

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

答案 1 :(得分:4)

是的,这是预期的行为。项目属性 - > C / C ++ - >高级到"强制包含文件"设置控件Visual C++ compiler option /FI

  

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

因此,它可以让您免于手动包含stdafx.h。

虽然,您可以将预编译头与GCC和其他编译器一起使用 Visual C ++的快捷方式行为不能在其他编译器中移植。因此,请查看How to handle stdafx.h in cross-platform code?讨论便携式解决方案的想法。

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

答案 2 :(得分: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"应仅作为源文件中的第一个非注释行而不是头文件中找到。