一般在C++开发中,会使用头文件( .h/hpp )和源文件( .cpp/cxx )将函数的声明和实现分开。当需要使用某个函数时,将声明函数所在的头文件引用进来即可。在较复杂的项目中会引用很多头文件,这些头文件可能来自于标准库、操作系统相关库、第三方库和自身项目。在实际开发过程中,多个头文件的引用顺序通常并不会有很大的影响;但是从编码风格和项目维护等方面考虑,头文件的引用顺序确是值得注意的。

头文件引用顺序

一般来讲,头文件的使用者并不需要关注头文件的引用顺序,只要代码能够正常编译即可,由头文件引用顺序导致的问题其实是头文件本身的问题。头文件的编写者应该保证提供的头文件不需要先包含其他头文件,并且在使用时尽量不影响其他头文件。

  • 头文件在使用时不需要先包含其他头文件。这要求在头文件编写时将自己依赖的头文件都引用进来,这样的头文件就是自给自足的(self contained)。
  • 头文件在引用后不影响其他头文件。这要求在头文件中使用宏定义、结构体字节对齐等语法特性时要特别注意,因为这些语法的作用范围会扩散到随后引用的头文件中。

针对头文件的引用顺序有两种常见的编码风格,下面会进行展开说明。

Google风格

Google在其C++编码风格指南1中提到了头文件引用顺序问题,其中给出的建议是:

  1. cpp文件对应的h文件
  2. C标准库头文件
  3. C++标准库头文件
  4. 第三方库头文件
  5. 本工程头文件

其中,每一类头文件之间要留一个空行方便区分。

Lakos风格

Lakos在其编写的《Large Scale C++ Software Design》中推荐了下面的排序风格:

  1. cpp文件对应的h文件
  2. 本工程头文件
  3. 第三方库头文件
  4. C++标准库头文件
  5. C标准库头文件

小结

这两种风格都推荐将cpp文件对应的h文件放在引用顺序的最开始位置,因为这样能够帮我们检查自己编写的头文件是否是“自给自足”的,我们自己的cpp文件充当了对应h文件的第一个测试用例。

对于后续的顺序,这两种风格所提倡的头文件引用顺序是正好相反的,我认为各有道理。从我的编程经验来看,标准库的头文件的质量通常是有保证的,出现头文件顺序的问题概率较小。而第三方库的头文件的质量就会有较大差异,而且多个个第三方库之间的头文件也会相互干扰。

Footnotes:

1

谷歌风格

(全文完)