应该以什么顺序指定包含文件,即包含一个头文件在另一个头文件之前的原因是什么?
例如,系统文件、STL和Boost是在本地包含文件之前还是之后?
应该以什么顺序指定包含文件,即包含一个头文件在另一个头文件之前的原因是什么?
例如,系统文件、STL和Boost是在本地包含文件之前还是之后?
当前回答
这不是主观的。确保你的头文件不依赖于以特定顺序被#包含。可以肯定的是,不管你以什么顺序包含STL或Boost头文件。
其他回答
这不是主观的。确保你的头文件不依赖于以特定顺序被#包含。可以肯定的是,不管你以什么顺序包含STL或Boost头文件。
我不认为有一个推荐的顺序,只要它编译!令人恼火的是,有些头文件需要先包含其他头文件……这是头文件本身的问题,而不是包含顺序的问题。
我个人倾向于从局部到全局,每个小节按字母顺序排列,即:
H文件对应此CPP文件(如适用) 来自同一个组件的头文件, 来自其他组件的头文件, 系统头文件。
我的理由是1。它应该证明每个头文件(其中有cpp)可以在没有先决条件的情况下被#包含(terminus technicus:头文件是“自包含的”)。剩下的似乎就从这里顺理成章地展开了。
我遵循两个简单的规则来避免绝大多数问题:
所有的头文件(实际上包括任何源文件)都应该包含它们所需要的内容。他们不应该依赖于他们的用户,包括东西。 作为补充,所有的头文件都应该包含保护,这样它们就不会因为过于雄心勃勃地应用上述规则1而被多次包含。
我还遵循以下准则:
首先使用分隔线包含系统头文件(stdio.h等)。 将它们进行逻辑分组。
换句话说:
#include <stdio.h>
#include <string.h>
#include "btree.h"
#include "collect_hash.h"
#include "collect_arraylist.h"
#include "globals.h"
虽然,作为指导方针,这是主观的事情。另一方面,我严格执行规则,甚至提供'包装'头文件包含保护和分组包含,如果一些讨厌的第三方开发人员不同意我的愿景:-)
我建议:
正在构建的.cc模块的头文件。(有助于确保项目中的每个头文件对项目中的其他头文件没有隐式依赖。) C系统文件。 c++系统文件。 平台/操作系统/其他头文件(例如win32、gtk、openGL)。 项目中的其他头文件。
当然,在可能的情况下,每个部分都要按字母顺序排列。
总是使用前向声明来避免在头文件中包含不必要的#。
要记住的一件重要的事情是,您的头文件不应该依赖于首先包含的其他头文件。确保这一点的一种方法是在任何其他头文件之前包含您的头文件。
《c++思维》特别提到了这一点,引用了Lakos的《大规模c++软件设计》:
可以通过确保组件的.h文件自己进行解析来避免潜在的使用错误——没有外部提供的声明或定义……将.h文件作为.c文件的第一行,可以确保.h文件中不缺少组件物理接口固有的关键信息(或者,如果有的话,在尝试编译.c文件时就会发现它)。
也就是说,按以下顺序包括:
这个实现的原型/接口头文件(即.h/。对应于.cpp/. Hh文件。cc文件)。 同一项目中的其他头文件,视需要而定。 来自其他非标准、非系统库(例如Qt、Eigen等)的头文件。 来自其他“几乎标准”库的头文件(例如,Boost) 标准c++头文件(例如iostream, functional等) 标准C头文件(例如,cstdint, direct .h等)
如果任何标题在这个顺序中有问题,要么修复它们(如果你的),要么就不要使用它们。抵制不编写干净头文件的库。
谷歌的c++风格指南几乎完全相反,没有任何正当理由;我个人倾向于Lakos方法。