头文件中的预编译头

Precompiled Headers in Header Files

本文关键字:编译 文件      更新时间:2023-10-16

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

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

在Visual Studio中,在"项目属性"->"C/C++"->"高级"下有一个选项可用于"强制包含文件"。我将编译器选项设置为stdafx.h.

完成此操作后。。我不再需要包括我添加到stdafx.h的头文件,甚至在我的头文件中(源文件应该自动包括stdafx.h)。这是预期的行为吗?

在头文件/源文件之间,我找不到清晰的区别。

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

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

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

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

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

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

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

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

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

不要使用"强制包含文件"设置(/FI),因为它会破坏Edit&持续(微软似乎不想解决这个问题)

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