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

当我编译包含预编译头文件的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 <precompiled.h>放入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,这就暗示了一个子包含应该没问题。

我错了吗?


这是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如此跳过它。

谷歌的迭戈诺维洛和其他人正在努力改善GCC的PPH分支。 我不知道他们的工作对于GCC 4.8是否足够成熟

顺便说一句,我发现在编译器内部存在一个垃圾收集器是绝对必要的,但我发现GCC的GC非常差...(大多数GCC贡献者不同意我的立场)。


这原来是文档中的一个错误。 Gcc不再支持subincludes中的预编译头文件:

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

链接地址: http://www.djcxy.com/p/86907.html

上一篇: In GCC, can precompiled headers be included from other headers?

下一篇: Cross compile static libnuma for arm