squ*_*art 265
我不认为有推荐的订单,只要它编译!令人讨厌的是,当某些标头需要首先包含其他标头时...这是标题本身的问题,而不是包含的顺序.
我个人的偏好是从本地到全球,每个子部分按字母顺序排列,即:
我的理由是,它应该证明每个标题(有一个cpp)都可以#include
没有先决条件.其余的似乎从那里开始逻辑流动.
Nat*_*ons 92
要记住的重要一点是,您的标头不应该依赖于首先包含的其他标头.确保这一点的一种方法是在任何其他标头之前包含您的标头.
"用C++思考"特别提到了这一点,引用了Lakos的"大规模C++软件设计":
通过确保组件的.h文件自行解析,可以避免潜在的使用错误 - 没有外部提供的声明或定义......包含.h文件作为.c文件的第一行确保没有关键部分.h文件中缺少组件物理接口固有的信息(或者,如果有的话,只要您尝试编译.c文件就会发现它).
也就是说,按以下顺序包括:
如果任何标题包含在此顺序中的问题,请修复它们(如果您的)或不使用它们.阻止不编写干净标头的库.
谷歌的C++风格指南认为几乎相反的,跟真的没有道理的; 我个人倾向于赞成Lakos方法.
pax*_*blo 48
我遵循两个简单的规则来避免绝大多数问题:
我也遵循以下准则:
换一种说法:
#include <stdio.h>
#include <string.h>
#include "btree.h"
#include "collect_hash.h"
#include "collect_arraylist.h"
#include "globals.h"
Run Code Online (Sandbox Code Playgroud)
虽然,作为指导方针,这是一个主观的事情.另一方面,我严格执行规则,甚至提供包含警卫的"包装"头文件和分组包括如果一些讨厌的第三方开发人员不订阅我的愿景:-)
Mat*_* M. 21
把我自己的砖添加到墙上.
所以我通常会这样:
// myproject/src/example.cpp
#include "myproject/example.h"
#include <algorithm>
#include <set>
#include <vector>
#include <3rdparty/foo.h>
#include <3rdparty/bar.h>
#include "myproject/another.h"
#include "myproject/specific/bla.h"
#include "detail/impl.h"
Run Code Online (Sandbox Code Playgroud)
每个组用下一个空白行分隔:
另请注意,除了系统标头之外,每个文件都位于具有其命名空间名称的文件夹中,因为它更容易以这种方式跟踪它们.
msa*_*ord 14
我很确定这在理智的世界中的任何地方都不是推荐的做法,但我喜欢将系统包含在文件名长度中,并在相同长度内排序.像这样:
#include <set>
#include <vector>
#include <algorithm>
#include <functional>
Run Code Online (Sandbox Code Playgroud)
我认为在其他人之前包含你自己的标题是个好主意,以避免包含顺序依赖的耻辱.
i_a*_*orf 14
我建议:
当然,在可能的情况下,每个部分的字母顺序.
始终使用前向声明以避免#include
头文件中不必要的s.
首先包含与 .cpp 对应的标头...换句话说,应该在包含其他任何内容之前source1.cpp
包含。source1.h
我能想到的唯一例外是当使用带有预编译标头的 MSVC 时,在这种情况下,您必须在stdafx.h
其他任何内容之前包含。
推理:将 包含source1.h
在任何其他文件之前可确保它可以独立存在而无需依赖。如果source1.h
稍后出现依赖项,编译器将立即提醒您将所需的前向声明添加到source1.h
. 这反过来又确保了标头可以由其相关项以任何顺序包含。
例子:
源1.h
class Class1 {
Class2 c2; // a dependency which has not been forward declared
};
Run Code Online (Sandbox Code Playgroud)
源1.cpp
#include "source1.h" // now compiler will alert you saying that Class2 is undefined
// so you can forward declare Class2 within source1.h
...
Run Code Online (Sandbox Code Playgroud)
MSVC 用户:我强烈建议使用预编译头。因此,将#include
标准标头(以及其他永远不会更改的标头)的所有指令移至stdafx.h
.