在gcc中使用预编译头文件

时间:2014-10-22 09:48:08

标签: gcc precompiled-headers

我正在研究使用预编译头来减少编译时间。

我在这里阅读了有关该主题的文档:https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html,其中我读了以下内容:

  

在特定编译中只能使用一个预编译头。

在我希望改进其构建时间的项目中,通常包含很长的列表。上面让我认为,为了获得最大的性能改进,我将不得不制作一个常见包含的集合,将它们放入一个Header文件中,编译并包含该Header文件。

另一方面,我更愿意明确列出特定文件中的依赖项,因此我倾向于先包含预编译的Header,然后是实际Header文件的Manual列表。

我有两个与此相关的问题:

  1. 我的分析和方法是否正确?我是否正确解释了该陈述?

  2. 这样做,我会在很多地方使用这个文件(比如stdafx.h),从而包含我不需要的文件。但是,出于代码文档的目的,我想明确列出我的依赖项。 我要做的事情如下:

    #ifdef USE_PRECOMPILED_HEADERS 
    #include "stdafx.h"
    #else
    #include "dep1.h"
    #include "dep2.h"
    #endif
    

    我可以定期运行没有预编译标头的构建,以检查是否列出了所有的依赖项。然而,这有点笨拙。有没有人有更好的解决方案?

  3. 如果有人有信息帮助我们在调查中获得更好的结果,我很高兴听到他们。

2 个答案:

答案 0 :(得分:1)

  1. 是的,你的观察绝对没问题! 你"would have to make a collection of common includes, put them into a single Header file, compile and include that Header file"。这个通用头文件通常命名为stdafx.h(尽管你可以将它命名为任何你想要的名字!)

  2. 我恐怕不太明白这部分问题。

  3. 编辑:

    您是否还希望标准标题(如iostreammapvector等)作为依赖项包含在代码文档中?

    通常这必须是。因此,您必须仅包括stdafx.h中不受您控制的那些头文件(即,[1]标准语言包括[2]包括来自相关模块(主要是公开的接口头))。休息所有包含(其源位于当前项目/模块中)必须在任何需要的地方显式包含在每个头文件中,而不是放在预编译的stdafx.h中。

答案 1 :(得分:0)

  

以上引导我认为要获得最佳性能   改进,我将不得不做一个共同的集合   包括,将它们放入一个Header文件,编译和   包括该头文件。

是的,这个观察是正确的:你把大多数(所有?)包含在一个单独的头文件中,然后进行预编译。

反过来,这意味着......

  • 任何编译没有借助预编译的标题将年龄;
  • 您依靠命名惯例或其他方式(文档?)来在您的个人翻译单元中引用的内容与其声明之间建立信息链接。

出于这些原因,我不太喜欢预编译的标题......