为什么 Google 风格指南规定系统 headers 在项目 headers 之前?
Why does the Google Style Guide dictates that system headers come before project headers?
在 C++ Google 风格指南的 header 部分,第一行说:
Use standard order for readability and to avoid hidden dependencies:
Related header, C library, C++ library, other libraries' .h, your
project's .h.
但这对我来说似乎倒退了,因为项目的 headers 很可能依赖于系统 headers 而系统 headers 显然不太可能依赖于项目 headers。简化指南中给出的示例,我们得到以下 #include
行 X.cpp
依赖于 X.h
、标准 header <vector>
和另一个文件项目的代码库,A.h
:
#include "X.h"
#include <vector>
#include "other/module/A.h"
如果 A.h
依赖于 <vector>
,样式的顺序隐藏了问题。如果 header 以最相关到最不相关的顺序包含,问题就会暴露出来。
我错过了什么?也许 counter-argument 是当 A.cpp
被编译时会暴露这个问题,但如果没有 A.cpp
开头(即 A.h
是 header-only).
似乎已经过去了很多年没有答案。
我注意到我实际上是在使用 header 包含由 Google Style Guide, without much reasoning behind it, as indeed none was given in the Names and Order of Includes section, unlike other sections. So from their goals 规定的顺序我只能猜测这样做是为了保持一致性,允许像他们所说的那样进行一些自动化,以及 "Just pick one [rule] and stop worrying about it" 这样人们就可以停止争论规则。
太糟糕了,因为看起来 Nathan's answer in this question 给出的顺序和推理在今天更有意义。就个人而言,我会逐渐转向那种风格的包含。
希望 C++ 代码中管理依赖项的未来改进将使这种情况变得更好。理想情况下,根本不必担心声明依赖项的顺序,并且有更好的时间检测和删除过时的包含、使用、导入等。
在 C++ Google 风格指南的 header 部分,第一行说:
Use standard order for readability and to avoid hidden dependencies: Related header, C library, C++ library, other libraries' .h, your project's .h.
但这对我来说似乎倒退了,因为项目的 headers 很可能依赖于系统 headers 而系统 headers 显然不太可能依赖于项目 headers。简化指南中给出的示例,我们得到以下 #include
行 X.cpp
依赖于 X.h
、标准 header <vector>
和另一个文件项目的代码库,A.h
:
#include "X.h"
#include <vector>
#include "other/module/A.h"
如果 A.h
依赖于 <vector>
,样式的顺序隐藏了问题。如果 header 以最相关到最不相关的顺序包含,问题就会暴露出来。
我错过了什么?也许 counter-argument 是当 A.cpp
被编译时会暴露这个问题,但如果没有 A.cpp
开头(即 A.h
是 header-only).
似乎已经过去了很多年没有答案。
我注意到我实际上是在使用 header 包含由 Google Style Guide, without much reasoning behind it, as indeed none was given in the Names and Order of Includes section, unlike other sections. So from their goals 规定的顺序我只能猜测这样做是为了保持一致性,允许像他们所说的那样进行一些自动化,以及 "Just pick one [rule] and stop worrying about it" 这样人们就可以停止争论规则。
太糟糕了,因为看起来 Nathan's answer in this question 给出的顺序和推理在今天更有意义。就个人而言,我会逐渐转向那种风格的包含。
希望 C++ 代码中管理依赖项的未来改进将使这种情况变得更好。理想情况下,根本不必担心声明依赖项的顺序,并且有更好的时间检测和删除过时的包含、使用、导入等。