c – 在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所以跳过它.
Diego Novillo和Google的其他人正在努力改进GCC的PPH分支.我不知道他们的工作是否足够成熟GCC 4.8
顺便说一句,我发现在编译器中存在垃圾收集器绝对必要,但我发现GCC的GC很差……(大多数GCC贡献者不同意我的立场).
标签:c,g,precompiled-headers 来源: https://codeday.me/bug/20191007/1866952.html