【问题标题】:Why include related header first?为什么要先包含相关标题?
【发布时间】:2018-10-09 08:42:18
【问题描述】:

关于C/C++ include file order/best practices的问题,最好的答案建议先包含相关的header。

GoogleMozilla 样式指南相同。

但是,在这两种情况下,我都找不到您这样做的充分理由。

Google 和 Mozilla 编码规则在我看来最好,因为它们强制您首先包含最“标准”的标头。

这样,我认为您不太可能弄乱包含的文件(例如,通过取消定义其他头文件中使用的一些宏等),所以这对我来说似乎是最好的方法。

但是按照这个原理,为什么要先包含相关的标题?由于其中的任何语法错误都可能会弄乱以下所有标题?

我认为最好将相关标题放在最后。

【问题讨论】:

  • @user463035818 - 相应地更新了我的答案。谷歌禁止转发声明 IIRC,所以这是他们不会发布的一些理由。
  • “相关”一词的使用相当模糊。所有包含都应该是“相关的”,否则为什么要包含它们?请更正这一点,可能使用您引用的问题中的原始术语“对应”。
  • @StoryTeller 他们不禁止转发声明,这将严重限制他们可以编写的正确、有用的代码集(任何类型的循环都需要转发声明,除非你删除所有类型)。它们将使用限制在必要的情况下。
  • @KonradRudolph - 现在重新阅读它,它似乎不像我记得的那样严厉。坦率地说,我仍然觉得在风格指南中根本不值得一提。但这是他们的特权。
  • @StoryTeller 是的,同意。总的来说,Google C++ 风格指南充其量仍然是在浪费时间,最坏的情况是非常糟糕的建议(尽管它与过去的版本相比有了很大的改进)。不幸的是,它是如此突出,以至于很多人都觉得它具有权威性。

标签: c++ header-files


【解决方案1】:

这是为了确保您的客户在包含您的库标题时不会讨厌您。

如果标题很脆弱并且会因错误的包含顺序而中断,它可能会在您的环境中工作,但它不是第一个 - 因为您包含 需要的标题 - 但未能编译客户端代码。因为它可能根本不明显需要拉入哪些其他标头才能使其工作。

首先包含与当前实现文件相对应的标头用于检查标头是否自包含。自包含不仅仅是包括必要的标题。它还需要为您在 API 中使用的类型添加所需的前向声明。如果你在它之前包含类型的标题,你的标题自然会编译,但你可能不希望将它拉入,因为你只依赖于 API 中的类型名称。

一些风格指南禁止前向声明,所以这些可能不是他们提出的理由的一部分。

【讨论】:

    【解决方案2】:

    先包含cpp文件相关的header,保证header是自包含的,不需要其他include编译

    【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2011-01-18
    • 2013-11-27
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2018-10-09
    相关资源
    最近更新 更多