头文件中的预编译头

irw*_*inb 14 c++ gcc precompiled-headers visual-studio visual-c++

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

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

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

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

我找不到头文件/源文件之间区别的地方.

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

syp*_*lex 18

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周围或包含错误的标题.

  • 不,force include选项将文件添加到每个source/cpp文件的第一行.方式包括工作是将要包含的文件的内容放入#include位置的源文件中.使用force include选项可以使每个CPP文件的顶部都包含StdAfx.h的内容,然后是所有头文件和源代码的内容(无论文件中的顺序如何).因此效果是,您的StdAfx.h中定义的所有内容都将在该项目的标题中提供.编译器只查看源文件而不是标题. (3认同)

mlo*_*kot 5

是的,这是预期的行为。项目属性-> C / C ++->“强制包含文件”的高级设置可控制Visual C ++编译器选项/ FI

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

因此,它使您不必手动包含stdafx.h。

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

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