C++标题 - 包含时的最佳实践

JT.*_*JT. 5 c++ header

C++标头

如果我有A.cpp和Ah以及bh,ch,dh

我应该这样做:

在啊:

#include "b.h"
#include "c.h"
#include "d.h"
Run Code Online (Sandbox Code Playgroud)

在A.cpp中:

#include "A.h"
Run Code Online (Sandbox Code Playgroud)

要么

在A.cpp中:

#include "A.h"
#include "b.h"
#include "c.h"
#include "d.h"
Run Code Online (Sandbox Code Playgroud)

有性能问题吗?明显的好处?这有什么不好的吗?

Ada*_*eld 21

你应该只包括编译所需的内容; 添加不必要的包含会损害您的编译时间,尤其是在大型项目中.

每个头文件应该能够自己完全编译 - 也就是说,如果你有一个只包含那个头的源文件,它应该编译没有错误.头文件应包含不超过必要的内容.

尝试尽可能使用前向声明.如果你正在使用一个类,但是头文件只处理指向该类对象的指针/引用,那么就不需要包含该类的定义 - 只需使用前向声明:

class SomeClass;
// Can now use pointers/references to SomeClass
// without needing the full definition
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 6

这里的关键实践是在每个foo.h文件周围都有一个警卫,例如:

#ifndef _FOO_H
#define _FOO_H

...rest of the .h file...
#endif
Run Code Online (Sandbox Code Playgroud)

这可以防止多重包含,包含循环和所有此类伴随的恐怖.一旦确保每个包含文件都受到保护,具体细节就不那么重要了.

我喜欢亚当表达的一个指导原则:确保,如果源文件只包含a.h,它将不会因为a.h假设其他文件被包含在其中而不可避免地得到错误- 例如,如果a.h需要b.h包含之前,它可以而且应该只是包括BH本身(守卫会做出一个空操作,如果BH 先前已列入)

反之亦然,源文件应该包含它需要的标题(宏,声明等),而不是假设其他标题只是神奇地进入,因为它包含了一些.

如果你按价值使用课程,唉,你需要.h包含一些类的血腥细节.但是对于通过引用或指针的一些用途,只需一个裸class sic;就足够了.例如,所有其他条件相同,如果类a可以使用指向类b实例的指针(即成员class b *my_bp;而不是成员class b *my_b;),则可以使包含文件之间的耦合变弱(减少重新编译) - 例如b.h可能有不止一点class b;,而所有的血淋淋的细节都在b_impl.h其中仅由报头包含真的需要它?


Mar*_*ett 0

最好不要在其他标头中包含标头 - 它会减慢编译速度并导致循环引用