在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 /测试> C++ #包括 #包括 main(){} >g++-4.7--std=c++11等等。。。测试. C++ +H 2>1×GRIP预编译 ! 预编译的.h.gch

在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 /测试> C++ #包括 #包括 main(){} >g++-4.7--std=c++11等等。。。测试. C++ +H 2>1×GRIP预编译 ! 预编译的.h.gch,c++,g++,precompiled-headers,C++,G++,Precompiled Headers,(!表示gcc找到并使用了预编译头) 但是,当我将#include放入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 /测试> C++ #包括 main(){} >g++-4.7--std=c++11等等。。。测试. C++

(!表示gcc找到并使用了预编译头)

但是,当我将#include放入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
<代码> /测试> C++ #包括 main(){} >g++-4.7--std=c++11等等。。。测试. C++ +H 2>1×GRIP预编译 . 预编译的.h (否!或x表示gcc未能找到预编译头)

发生什么事了?我的理解是,只要gcc在任何C/C++标记之前命中指向带有相应.gch的头的#include,它就会使用gch,这对我来说,子include应该是可以的


我错了吗?

这是GCC(实现)当前的一个弱点

今天,GCC预编译头本质上是在解析整个头之后编译器状态的内存转储(PCH使用GCC垃圾收集器机制,在编译器的源代码和
gengtype
)中带有注释,以使其工作;基本上,ggc是在PCH中复制整个GCC堆[编译器中的数据]

对于用户来说,这意味着当前唯一获取PCH利润的方法是只有一个标头(它本身将包括多个系统标头,如C中的
或C++中的
),它包含在所有
*.C
*.cc
文件中

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

Diego Novillo和谷歌的其他人正在GCC的分支中努力改进这一点。我不知道他们的工作对于GCC4.8是否足够成熟


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

这是文档中的一个错误。Gcc不再支持子包中的预编译头:


错误文件:

Winvalid pch是否给出了任何提示?您是否满足了所有的要求?也张贴标题。h@MSalters不,我正在使用-Winvalid-pch,它没有告诉我任何事情@VJovic是的,我相信我符合所有要求。在第二个例子中,头文件的第一行是:<代码>包含了< /代码>。其余的不应该是重要的,对吧?BTW,预编译头不是标准C++语言的一部分,是编译器特有的。不能保证一个预编译头文件可以在其他翻译单元中使用。我猜这个问题完全是针对GCC的。因此,即使在第二个示例中,
#include
header.h
中的第一行,它仍然会跳过PCH?我刚刚尝试了GCC 4.2中给出的示例,它发现并使用了预编译的header,但我认为这是GCC 4.7中的一个bug(公平地说,它仍处于测试阶段)我假设数据转储是每个翻译单元只能使用一个PCH的原因?对不起,伙计们。我感到有点内疚,因为我抱怨一个好的功能被破坏了,他们的回应是从文档中删除了它的所有痕迹:(