为啥 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
依赖于<vector>
,则样式的顺序隐藏了问题。如果标题按最相关到最不相关的顺序包含,则会暴露问题。
我错过了什么?也许相反的论点是,当A.cpp
被编译时,这个问题会暴露出来,但是如果没有A.cpp
开头(即A.h
是仅标题),则该论点不成立。
【问题讨论】:
如果包含的顺序很重要,那么您做错了什么。 如果A.h
依赖于<vector>
,为什么文件中没有#include <vector>
行?
@HenriMenke @MrEricSir 本指南的重点是防御性编码和发现潜在问题。要发现 A.h
缺少标题,您需要按照指南规定的相反顺序包含。我认为该指南的目标正确,但解决方案错误。
每个人的风格指南都有。系统头的含义不能被项目头改变,或者以任何方式依赖于它们,但是你可以让项目头依赖于系统头。
【参考方案1】:
似乎已经过去了好几年没有答案。
我注意到我实际上使用了由Google Style Guide 指定的标题包含顺序,而没有太多的理由,因为与其他部分不同,在包含的名称和顺序部分中确实没有给出任何内容。所以从他们的goals 我只能猜测这是为了保持一致性,允许像他们所说的那样进行一些自动化,以及“只需选择一个 [规则] 并停止担心它”,这样人们就可以停止争论规则。
太糟糕了,因为看起来Nathan's answer 在this question 中给出的顺序和推理在今天更有意义。就个人而言,我会逐渐改用那种包含样式。
希望将来在 C++ 代码中管理依赖项方面的改进将使这种情况变得更好。理想情况下,根本不必担心声明依赖项的顺序,并且有更好的时间检测和删除过时的包含、使用、导入等。
【讨论】:
感谢您抽出宝贵时间回复! :) 自从我提出这个问题以来,没有什么能动摇我的意见,我基本上就像你提到的那个答案一样订购它们。 不客气!有趣的是,当我自己有同样的问题时,我发现了你的问题。然后我不得不花更多的时间来研究并自己回答:)。好吧,我猜“这就是你的 Stack Overflow”。以上是关于为啥 Google 样式指南规定系统标头位于项目标头之前?的主要内容,如果未能解决你的问题,请参考以下文章