头文件中的预编译头
Precompiled Headers in Header Files
今天我第一次遇到预编译的头。。永远改变着我的生活。我不敢相信编译我的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"
只能作为源文件中的第一个非注释行,而不能在头文件中找到。
- 使用 MEX 编译C++文件
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何交叉编译C++文件
- 使用 MinGW 在 Windows 上的命令行编译C++文件
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 解析模板和范围后获取编译文件?
- 我的 PowerShell 脚本无法按预期工作(用于编译C++文件)
- 如何在不制作Visual Studio 2017项目的情况下编译C++文件?
- 'void *' 'void (*) (bool)' 指针使用 c ++ 编译器在 C 中编译文件的错误
- 在没有节点GYP的目标平台上编译C/C 文件
- 生成文件似乎以错误的顺序编译文件
- 编译 C++ 文件失败,因为找不到"ssize_t"的定义
- NeatBeans Makefile:麻烦编译.H文件
- 我无法编译文件系统库
- 在不使用预编译头C++项目中编译 C 文件
- 无法使用 Xcode 和终端在 Mac OS 上使用 OpenGL 库编译 c++ 文件
- 获取编译文件的列表,并由Make Project包含
- MinGW .h 编译文件不起作用:此文件的版本与您运行的 Windows 版本不兼容
- 编译 c++ 文件时出错:未定义的符号
- C++编译文件