当我编译一个包含预编译头的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发现并使用了预编译头)
但是,当我在header.h中放入#include <预编译.h>时,它不起作用:
// 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应该是可以的。
我说错了吗?
发布于 2012-03-07 08:26:45
这被证明是文档中的一个错误。Gcc不再支持subincludes中的预编译头:
错误归档:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52518
发布于 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撰稿人不同意我的观点)。
https://stackoverflow.com/questions/9580058
复制相似问题