C++包括标头约定

use*_*536 8 c++ include header-files

假设我有一个文件Xh,它定义了一个类X,其方法在X.cc中实现.文件Xh包含一个文件Yh,因为它需要Y来定义类X.在X.cc中,我们可以引用Y,因为Xh已经包含了Yh我是否还应该在X.cc中包含Yh?

我知道我不需要,我可以依靠标题保护来防止多重包含.但一方面,包括Yh使得X.cc更加独立于Xh(当然不能完全独立).什么是公认的做法?

另一个例子:包括<iostream>.h和.cc文件.我看到有些人这样做,有些则没有.

GMa*_*ckG 10

最小化.在标题中,更喜欢前向声明到完整定义.例如,使用iosfwd而不是代替ostream.

也就是说,Xh和X.cc代表相同的逻辑单元.如果您对Yh的依赖性发生了变化(例如,将其变为前向声明),那么您无论如何都要更改该类.所以你可以#include "Y.h"理所当然地转向X.cc.

换句话说,X.cc和Xh齐头并进.X.cc可以可靠地假设Xh中的内容因此,如果Xh的话,不需要重新包含某些东西.

在那里你依赖"包括也无妨"的资源会出现其他比你自己.例如,如果你需要Zh,即使是Yh,你也要包括它.Xh不能可靠地假设Yh的内容,因为Xh不与Yh一起使用,它使用它.


cpa*_*mer 6

我建议在X.cc中包括Y的标题包括,即使它看起来多余.它为您提供了对依赖关系非常明确的优势.

作为相关说明,您应始终#include cpp文件的关联标头作为第一个#include'd文件.(第一个包含在X.cpp中的应该是Xh)这可以保证头部包含适当的文件来解析它自己的依赖关系,否则你可能会无意中依赖源文件中包含的顺序.