C++ 包含 header 约定

标签 c++ include header-files

假设我有一个文件 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/

相关文章:

c# - 如何在 Entity Framework 中包含排序的导航属性

C++头文件及其对应的源文件

jsf - 如何使用 JSF 2.0 Facelets 在 XHTML 中包含另一个 XHTML?

我可以在我的 C 程序中使用 OpenGL 进行图形处理吗?

c++ - 如何使 Boost dylibs 在 os x 上通用(i386 和 x86_64)?

c++ - 用于检测启动和终止的应用程序/进程的 WIN32 API

c++ - 需要帮助理解 C++ 中的有效 C 字符串操作

c++ - 写入文件时由 delete[] 引起的段错误

objective-c - 什么是文件名包含 "+"的导入语句?

c++ - 为什么我的代码显示错误 undefined reference to `WinMain@16' ?