c++ - 转发声明或自给自足的标题?

标签 c++ coding-style header include

<分区>

Google 的 C++ 风格指南 says , “当前向声明就足够时,不要使用#include。”

但是C++ Coding Standards (Sutter 和 Alexandrescu),第 23 项是“使头文件自给自足。负责任地行事:确保您编写的每个头文件都是可独立编译的,方法是让它包含其内容所依赖的任何头文件。”

哪种策略最好?

最佳答案

依赖管理在C++中非常重要:如果你改变了一个头文件,所有依赖这个头文件的翻译单元都需要被编译。这可能非常昂贵。因此,您希望头文件尽可能小,因为它们不包含任何不需要包含的内容。这就是 Google 的建议。

如果您需要某个组件,您应该包含该组件的标题。但是,除了要获取 声明的组件之外,您不应该要求包含任何内容。也就是说,每个头文件都必须在不包含任何其他内容的情况下进行编译。这是 Herb 和 Andrei 给出的建议。请注意,这适用于获取声明:如果您想使用这些声明中的任何一个并且这需要另一个组件,您可能还需要包含该组件的头文件。

然而,这两个建议是相辅相成的!它们都非常有值(value),应毫不妥协地遵循它们。这基本上意味着,如果您只需要声明的类,您更愿意声明一个类而不是包含它的标题。也就是说,如果类只出现在指针或引用定义、参数列表或返回类型中的声明中,那么声明类就足够了。如果您需要了解更多关于该类(class)的信息,例如因为它是正在定义的类的基类或成员,或者使用了对象,例如在内联函数中,您需要定义。实际上,如果您需要了解任何成员或类的大小,则需要类的定义。

一个有趣的变化是类模板:只有第一个类模板声明可以定义默认参数!然而,一个类模板可以声明多次。为了在声明类模板时使头文件最小化,您可能希望为所涉及的类模板提供特殊的转发头文件,这些模板只声明类模板及其默认参数。然而,这是进入实现领域的方式......

关于c++ - 转发声明或自给自足的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947198/

相关文章:

c++ - 每次迭代后更新帧

c++ - 混合使用 C++ 和程序集无法将多个参数从 C++ 函数传递给程序集

javascript - 能否设置 Eclipse Javascript 格式化程序以符合 JSLint 规范?

c# - HTTP GET 服务器 - 错误 header

c++ - 如何在 C++ 中将数组中的所有数字相加?

c - 出于清晰或优化的原因编写冗余程序流程语句?

java - 为什么数组的索引/列表不以 1 开头?

c++ - 包含文件困惑

php - 使用php刷新页面时是否可以记住url变量?

c++ - 当链接计数为2时,有没有办法完全删除一个inode?