假设我有一个文件 X.h,它定义了一个类 X,其方法在 X.cc 中实现。 文件X.h包含一个文件Y.h,因为它需要Y来定义类X。在X.cc中,我们可以引用 到 Y,因为 X.h 已经包含 Y.h。我还应该在 X.cc 中包含 Y.h 吗?
我知道我不需要,我可以依靠标题保护来防止多重包含。 但一方面,包含 Y.h 使 X.cc 更独立于 X.h(不能 当然完全独立)。公认的做法是什么?
另一个例子:包括<iostream>
在 .h 和 .cc 文件中。我看到有些人这样做
而有些则没有。
最佳答案
最小化。在 header 中,更喜欢前向声明而不是完整定义。例如,使用 iosfwd
而不是 ostream
。
也就是说,X.h 和 X.cc 代表相同的逻辑单元。如果您对 Y.h 的依赖性发生了变化(例如,将其变成前向声明),您无论如何都会更改类。所以你可以合理地将#include "Y.h"
移动到X.cc。
换句话说,X.cc 和 X.h 齐头并进。 X.cc 可以可靠地假定 X.h 中的内容。因此,如果 X.h 需要,则无需重新包含某些内容。
您“无论如何都包含它”的依赖项发生在您自己的资源之外。。例如,如果您需要 Z.h,即使 Y.h 需要,您也会包含它。 X.h 不能可靠地假定 Y.h 的内容,因为 X.h 不与 Y.h 一起使用,它使用它。
关于C++ 包含 header 约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555173/