当我编译包含预编译头文件的c ++文件时,一切都按预期工作
// test.c++
#include <precompiled.h>
#include <header.h>
main() {}
> g++-4.7 --std=c++11 BLAH... test.c++ -H 2>&1 | grep precompiled.h
! precompiled.h.gch
(!表示gcc找到并使用了预编译的头文件)
然而,当我把#include&lt; precompiled.h&gt;进入header.h,它不起作用:
// test.c++
#include <header.h>
main() {}
> g++-4.7 --std=c++11 BLAH... test.c++ -H 2>&1 | grep precompiled.h
. precompiled.h
(no!或x表示gcc未能找到预编译的头文件)
发生了什么事?我的理解是,只要gcc在任何C / C ++令牌之前找到指向带有相应.gch的头的#include,它就会使用GCH,这表明子包含应该没问题。
我错了吗?
答案 0 :(得分:4)
这是GCC目前的弱点(实施)。
今天,GCC预编译头在解析整个头之后基本上是编译器状态的内存转储(PCH在编译器源和gengtype
内使用带有GTY注释的Gcc垃圾收集器机制。所以使它工作;基本上 ggc 正在PCH中复制整个GCC堆[编译器内的数据]。
对于用户而言,这意味着获取PCH的唯一当前方法是只有一个标题(其本身将包含C中的<stdio.h>
或C ++中的<vector>
等多个系统标题)包含在所有*.c
或*.cc
个文件中。
当GCC编译一个PCH无法满足的#include
时(例如因为它之前有一些代码),它就会忽略该PCH。在你的例子中,它在尝试加载PCH之前已经解析了一些header.h
,并且它注意到它的堆不是空的(一些“位置”,即源文件位置,已经在里面),所以它不能使用PCH,所以跳过它。
Diego Novillo和Google的其他人正在努力在海湾合作委员会的PPH分支机构中加以改进。我不知道他们的工作是否足够成熟GCC 4.8
顺便说一句,我发现在编译器中存在垃圾收集器是绝对必要的,但我发现GCC的GC很差......(大多数GCC贡献者不同意我的立场)。答案 1 :(得分:1)
结果证明这是文档中的错误。 Gcc不再支持子包含中的预编译头文件: