单头文件,包含所有必需的#include语句

时间:2014-12-05 04:27:19

标签: c++ c header include

我目前正在处理包含大量源文件的程序。有时很难跟踪我已经拥有的库#include d。从理论上讲,我可以创建一个名为Headers.h的头文件,它只包含我需要的所有#include语句,然后生成所有其他头文件#include "Headers.h"

为什么这是一个好/坏主意?

3 个答案:

答案 0 :(得分:5)

<强>优点:

  • 稍微减少维护,因为您无需跟踪哪些文件包含来自哪些库或其他组件的标题。

<强>缺点:

  • 包含文件中的定义可能会相互冲突。特别是在你没有命名空间的C(你用C和C ++标记)
  • 特别是宏会导致难以调试的问题,其中宏定义意外地与文件中的某个名称或其他包含的文件冲突
  • 根据您使用的编译器,编译时间可能会爆炸。如果使用预编译头文件的编译器,它实际上可能会减少编译时间,但如果不相反则会发生相反的情况
  • 您经常会不必要地触发文件重建。如果您的构建系统设置正确,那么如果修改了任何包含的文件,则会重建每个源文件。如果始终在项目中包含所有标题,则更改任何标题将强制重新编译所有源文件。不太可能是系统标题的问题,但如果您在主文件中也包含自己的标题,那就是它。

总的来说,我不推荐这种做法。上面列出的最后一个特别重要。

最佳做法是仅包含每个文件中代码所需的标头。

答案 1 :(得分:0)

Harmic's answer的补充中,确实主要问题是构建系统(大多数构建器处理文件时间戳,而不是文件内容。omake是一个值得注意的例外)。

请注意,如果您只关心许多依赖项,GNU make可以与autodependencies一起使用,并与传递给-M*GCC选项一起使用(即g++并且实际上是预处理器。)

但是,许多图书馆向其用户提供了一个标题(例如<gtk/gtk.h>

此外,单个头文件对预编译头文件更友好。特别是GCC wants a single header for precompilation

另见ccache

答案 2 :(得分:0)

跟踪所有必需的包含将更加困难,因为它们是从c源文件中抽象出来的,而不是真正支持模块化pus #harmic

的所有缺点