是否要求c ++中#includes的某个订单是库/标题设计错误的标志?

App*_*ood 12 c++ include library-design

我已经使用了一些非常大规模的系统,从未见过所需的订单,但最近遇到了它.STL或STD库甚至Boost是否存在某些包含必须按特定顺序排列的情况?

Mic*_*urr 28

STL或STD库甚至Boost是否存在某些包含必须按特定顺序排列的情况?

对于标准,答案是重点,不是.我想Boost也是如此,虽然我没有查过.

从C标准:

标准标题可以按任何顺序包含在内; 在给定的范围内,每个可以被包括不止一次,除了包含的效果<assert.h>取决于NDEBUG(见7.2)的定义之外,没有任何效果不同于仅被包括一次.

C++标准有类似的措辞.

我的偏好是标题应该包含他们自己的依赖关系,但我和那些认为这是"浪费"的人一起工作.在我看来,没有标题包括他们的依赖是一个毫无价值的早期优化.


Fla*_*ame 9

这绝对听起来像一个糟糕的设计.如果以某种方式需要特定的订单,库应该提供一个标题,其中包含正确顺序的其他标题.

至于提升和STL,我很确定我还没有遇到过这种情况.


Kei*_*thB 9

需要按特定顺序指定包含几乎总是表示设计问题.减少无意中执行此操作的可能性的一种方法是进入将类的头文件包含为实现文件中的第一个#include的做法.

// A.cpp
#include "A.h"
#include "boost/shared_ptr.hpp"
#include <vector>

class A {
// ...
};
Run Code Online (Sandbox Code Playgroud)

这样,例如,如果Ah使用没有正确#include的向量,则A.cpp将无法编译.

我不记得我把它拿到了哪里; 它可能来自Lakos的"大规模C++设计"(一本可以真正使用更新的好书).