<分区>
Google 的 C++ 风格指南 says , “当前向声明就足够时,不要使用#include。”
但是C++ Coding Standards (Sutter 和 Alexandrescu),第 23 项是“使头文件自给自足。负责任地行事:确保您编写的每个头文件都是可独立编译的,方法是让它包含其内容所依赖的任何头文件。”
哪种策略最好?
<分区>
Google 的 C++ 风格指南 says , “当前向声明就足够时,不要使用#include。”
但是C++ Coding Standards (Sutter 和 Alexandrescu),第 23 项是“使头文件自给自足。负责任地行事:确保您编写的每个头文件都是可独立编译的,方法是让它包含其内容所依赖的任何头文件。”
哪种策略最好?
最佳答案
依赖管理在C++中非常重要:如果你改变了一个头文件,所有依赖这个头文件的翻译单元都需要被编译。这可能非常昂贵。因此,您希望头文件尽可能小,因为它们不包含任何不需要包含的内容。这就是 Google 的建议。
如果您需要某个组件,您应该包含该组件的标题。但是,除了要获取 声明的组件之外,您不应该要求包含任何内容。也就是说,每个头文件都必须在不包含任何其他内容的情况下进行编译。这是 Herb 和 Andrei 给出的建议。请注意,这仅适用于获取声明:如果您想使用这些声明中的任何一个并且这需要另一个组件,您可能还需要包含该组件的头文件。
然而,这两个建议是相辅相成的!它们都非常有值(value),应毫不妥协地遵循它们。这基本上意味着,如果您只需要声明的类,您更愿意声明一个类而不是包含它的标题。也就是说,如果类只出现在指针或引用定义、参数列表或返回类型中的声明中,那么声明类就足够了。如果您需要了解更多关于该类(class)的信息,例如因为它是正在定义的类的基类或成员,或者使用了对象,例如在内联函数中,您需要定义。实际上,如果您需要了解任何成员或类的大小,则需要类的定义。
一个有趣的变化是类模板:只有第一个类模板声明可以定义默认参数!然而,一个类模板可以声明多次。为了在声明类模板时使头文件最小化,您可能希望为所涉及的类模板提供特殊的转发头文件,这些模板只声明类模板及其默认参数。然而,这是进入实现领域的方式......
关于c++ - 转发声明或自给自足的标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947198/