首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GCC中,预编译头可以包含在其他头中吗?

在GCC中,预编译头可以包含在其他头中吗?
EN

Stack Overflow用户
提问于 2012-03-06 16:16:13
回答 2查看 1.3K关注 0票数 2

当我编译一个包含预编译头的c++文件时,一切都正常工作

代码语言:javascript
复制
// 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发现并使用了预编译头)

但是,当我在header.h中放入#include <预编译.h>时,它不起作用:

代码语言:javascript
复制
// test.c++
#include <header.h>
main() {}

> g++-4.7 --std=c++11 BLAH... test.c++ -H 2>&1 | grep precompiled.h
. precompiled.h

(不!或者x表示gcc找不到预编译头)

到底怎么回事?我的理解是,只要gcc在任何C/C++令牌之前点击一个指向具有相应.gch的头的#include,它就会使用GCH,这向我建议子include应该是可以的。

我说错了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-07 08:26:45

这被证明是文档中的一个错误。Gcc不再支持subincludes中的预编译头:

错误归档:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52518

票数 2
EN

Stack Overflow用户

发布于 2012-03-07 05:20:06

这是目前GCC (执行)的一个弱点。

如今,GCC预编译头文件本质上是解析完整个头文件后编译器状态的内存转储(PCH使用了Gcc垃圾收集器机制,在编译器的源代码和gengtype中使用了GTY注释),所以它才能正常工作;基本上,ggc复制了整个GCC文件,并将数据堆到了PCH内部的编译器中。

对于用户来说,这意味着目前从PCH中获利的唯一方法是只有一个头文件(它本身将包括几个系统头文件,如C中的<stdio.h>或C++中的<vector> ),它包含在所有的*.c*.cc文件中。

当GCC编译一个PCH不能满足的#include时(例如,因为它之前有一些代码),它只是忽略那个PCH。在您的示例中,在尝试加载PCH之前,它已经解析了一些header.h,并且它注意到它的堆不是空的(一些“位置”,即源文件位置已经在其中),所以它不能使用PCH,所以跳过它。

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

顺便说一句,我发现在编译器中存在垃圾收集器是绝对必要的,但我发现GCC的GC非常糟糕……(大多数GCC撰稿人不同意我的观点)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9580058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档