在GCC中,预编译的头文件是否可以包含在其他头文件中?

时间:2012-03-06 08:16:13

标签: c++ g++ precompiled-headers

当我编译包含预编译头文件的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,这表明子包含应该没问题。

我错了吗?

2 个答案:

答案 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不再支持子包含中的预编译头文件:

提交的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52518