[C++] 在c ++中包含#includes是否需要一个特定的顺序来标记不良的库/头部设计?


Answers

这听起来像是一个糟糕的设计。 如果需要某种特定的顺序,图书馆应该提供一个包含其他正确顺序的标题。

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

Question

我已经使用了一些非常大规模的系统,从来没有见过所需的订单,但最近碰到它。 STL或STD库甚至Boost是否有某些包含特定命令的情况?




这也许是一个标志,你正在使用MFC,这可能反过来表明不好的设计(笑话...或者它?)

(至少,我上次看MFC的时候,对于包含<windows.h>地方真的很挑剔)




STL或STD库甚至Boost是否有某些包含特定命令的情况?

我从来没有遇到过,如果是这样的话,作者必须尽快通知。 哦,是的,它是一个非常糟糕的设计。




我喜欢按照字母顺序包括标题 - 可以很容易地看到我已经做了什么。

如果一个lib不能工作,因为它的顺序是错误的,那么这个lib就会被破坏,并且应该被修正以便与顺序无关。




这是一个“坏事”。 已经提到了一个更好的方法。 但我会详细说明。

//a.h
#ifndef _A_H_
#define _A_H_

//... code ...

#endif
// -----------------
//b.h
#ifndef _B_H_
#define _B_H_
#include a.h

//... code ...

#endif
// -----------------
//main.cpp Try 1
#include "b.h" //<- okay!  b includes a, then does b
// -----------------
//main.cpp Try 2
#include "a.h" //<- includes a
#include "b.h" //<- okay!  b includes a, but skips redefining it, then does b
// -----------------
//main.cpp Try 3
#include "b.h" //<- b includes a, then does b
#include "a.h" //<- okay!  a skips redefining itself!
// -----------------
//main.cpp Try 4
#include "a.h" //<- fail!  b is not included anywhere =(



你应该使用包括守卫和转发声明,这样你不应该有包括标题的顺序很多问题。

有时候还是需要首标或最后一个标题,不知道为什么。
(例如:在Source SDK中)