为啥 Google 样式指南规定系统标头位于项目标头之前?

Posted

技术标签:

【中文标题】为啥 Google 样式指南规定系统标头位于项目标头之前?【英文标题】:Why does the Google Style Guide dictates that system headers come before project headers?为什么 Google 样式指南规定系统标头位于项目标头之前? 【发布时间】:2017-04-15 00:11:57 【问题描述】:

在 C++ Google Style Guide 的标题部分中,第一行说:

使用标准顺序以提高可读性并避免隐藏依赖项: 相关头文件、C 库、C++ 库、其他库的 .h、您的 项目的.h。

但这在我看来是倒退的,因为项目的标头可能依赖于系统标头,而系统标头显然不太可能依赖于项目标头。简化指南中给出的示例,我们得到以下 #include 行,用于 X.cpp,它依赖于 X.h、标准头文件 <vector> 和项目代码库中的另一个文件 A.h

#include "X.h"

#include <vector>

#include "other/module/A.h"

如果A.h 依赖于&lt;vector&gt;,则样式的顺序隐藏了问题。如果标题按最相关到最不相关的顺序包含,则会暴露问题。

我错过了什么?也许相反的论点是,当A.cpp 被编译时,这个问题会暴露出来,但是如果没有A.cpp 开头(即A.h 是仅标题),则该论点不成立。

【问题讨论】:

如果包含的顺序很重要,那么您做错了什么。 如果A.h 依赖于&lt;vector&gt;,为什么文件中没有#include &lt;vector&gt; 行? @HenriMenke @MrEricSir 本指南的重点是防御性编码和发现潜在问题。要发现 A.h 缺少标题,您需要按照指南规定的相反顺序包含。我认为该指南的目标正确,但解决方案错误。 每个人的风格指南都有。系统头的含义不能被项目头改变,或者以任何方式依赖于它们,但是你可以让项目头依赖于系统头。 【参考方案1】:

似乎已经过去了好几年没有答案。

我注意到我实际上使用了由Google Style Guide 指定的标题包含顺序,而没有太多的理由,因为与其他部分不同,在包含的名称和顺序部分中确实没有给出任何内容。所以从他们的goals 我只能猜测这是为了保持一致性,允许像他们所说的那样进行一些自动化,以及“只需选择一个 [规则] 并停止担心它”,这样人们就可以停止争论规则。

太糟糕了,因为看起来Nathan's answer 在this question 中给出的顺序和推理在今天更有意义。就个人而言,我会逐渐改用那种包含样式。

希望将来在 C++ 代码中管理依赖项方面的改进将使这种情况变得更好。理想情况下,根本不必担心声明依赖项的顺序,并且有更好的时间检测和删除过时的包含、使用、导入等。

【讨论】:

感谢您抽出宝贵时间回复! :) 自从我提出这个问题以来,没有什么能动摇我的意见,我基本上就像你提到的那个答案一样订购它们。 不客气!有趣的是,当我自己有同样的问题时,我发现了你的问题。然后我不得不花更多的时间来研究并自己回答:)。好吧,我猜“这就是你的 Stack Overflow”。

以上是关于为啥 Google 样式指南规定系统标头位于项目标头之前?的主要内容,如果未能解决你的问题,请参考以下文章

Google代码风格指南

位于顶部的 UITableView 标头

为啥我的 CSS 样式输入不会位于其标签旁边?

在 R 中,为啥样式指南建议只使用双引号?

用于获取器和设置器的 Google 样式指南属性

世界顶级互联网公司 Google JavaScript 代码风格指南