如何为大量标头生成.pch

How to generate .pch for lots of headers?

本文关键字:pch      更新时间:2023-10-16

我的代码一直使用libcxx、sdl和其他一些库。我如何在考虑每个标头的情况下生成.pch?它可以包括一些其他标头(即使有复杂的条件,如#ifdef#include#endif。这就是为什么很难理解所需的标头文件列表。我应该只使用该文件夹中的所有标头文件来创建.pch吗?在这种情况下,这种.pch性能的使用情况如何?

更新:如果重要的话,我将把它与Clang(而不是GCC)一起使用,并通过Clang C API更具体。更新2:

我已经为单头文件创建了pch:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++

但我无法为多个文件生成pch:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch
clang: error: cannot specify -o when generating multiple output files

GCC编译器只能与一个包含的预编译头一起工作,如本答案所述。因此,如果您想在GCC中使用PCH,您需要为应用程序的所有翻译单元提供一个单独的头文件(每个头文件都应该以single#include指令开始)

我想这样的情况对其他支持一些预编译头的编译器也有帮助

C++标准的未来版本(C++14之后)可能会定义一个模块机制。参见例如n4047建议书。

请注意,预编译的头是非常特定于编译器的(对于GCC,当从GCC 4.9.1到GCC 4.9.2进行ugrading时,它们甚至可能不起作用),因此您不应该过于依赖它们。

首先,我没有将pch与gcc一起使用,只是与microsoft编译器一起使用。

#ifdef等条件都在编译前解决,所以如果您更改预处理器变量,PCH文件无论如何都会被编译。因此,只需添加库中所需的所有文件即可。

一般来说,包括所有不太可能经常更改的头(即外部库和系统中稳定的部分)。

不要太担心在pch文件中多次包含标头。由于此文件不会经常编译,因此可以忽略此处的高编译时间。

我不确定的是,当你在pch文件中包含所有内容时,可执行文件的大小是否会变大。这种情况可能是因为您引用了未使用的代码部分,而这些代码部分只是因为您将它们添加到了pch文件中才被编译到可执行文件中。你可能想测试一下。

现在,根据我的经验,另一个重要的问题是,在编译或链接时,编译性能是否较慢。

当你有很高的链接次数时,问题很可能是你在代码的头中包含了太多的头。

这可以通过在头文件中使用Forward声明并仅将头包含在.cpp文件中进行优化。我们有庞大的整体项目,每次编译/链接的最大性能提升都是通过尽可能多地前向声明来消除标头依赖关系。

这是因为增量编译效果很好,但增量链接却不行。

以下是关于远期申报的注意事项的简短但很好的汇编:http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

相关文章:
  • 没有找到相关文章