为什么libstdc++头文件中同时包含制表符和空格?

5

我一直在研究libstdc++头文件几年了,我总是惊讶于它是如何混合使用制表符和空格的,例如:

      template<typename _Up, typename... _Args>
<tab   >constexpr
<tab   >_Optional_payload_base(std::initializer_list<_Up> __il,
<tab   ><tab   ><tab   >       _Args&&... __args)
<tab   >: _M_payload(__il, std::forward<_Args>(__args)...),
<tab   >  _M_engaged(true)
<tab   >{ }

<...>

<tab   >  _Empty_byte _M_empty;
          _Up _M_value;
<tab   >};

      template<typename _Up>
<tab   >union _Storage<_Up, false>
<tab   >{

为什么即使在同一行内也会出现随机的制表符和空格混合?
如果使用非8个字符的制表符显示设置进行查看(presumably,很多用户可能使用这种方式),情况会更加混乱。
然而,libc++头文件看起来就很好(没有制表符),至少我记得是这样的...
显然,如果只谈论制表符与空格的区别,那么这将是一个基于观点的问题,但实际上是两者的混合。我认为从来都不是一个好主意,并且除了libstdc++之外,我还没有看到它出现在任何地方...

请不要滥用标签,这个问题与 c 没有任何关系,所以不要将其标记为 c - Pablo
这个话题也与C++无关 - 它只与libstdc++有关。无论如何,原因几乎肯定是libstdc++拥有悠久的历史,多位开发人员在多年/版本中进行了编辑。一些开发者使用一个插入制表符的编辑程序(默认情况下或因为他们已将其配置为此),有些开发者则使用插入空格而不是制表符的编辑程序,等等。少数开发人员甚至可能会在他们编辑过的部分中将制表符改为空格或反之亦然。这种混杂的制表符和空格的累积效应不会影响编译器。 - Peter
2个回答

6

这是传统的智能制表符缩进,旨在节省磁盘空间和在USB问世之前提高设备之间的传输速度。此外,在单个制表符上移动比在4或8个空格上移动,矩阵针式打印机可以更快地移动走纸。

  1. 制表符只用于行首。其他内容,如ASCII艺术和表格,应使用空格进行格式化。
  2. 制表符仅用于表示缩进级别。每个“块”只有一个制表符-其余空白只包含空格。

列表项摘自SmartTabsIndent with tabs, align with spaces的引用文章。


为什么template行从来不会前面加tab呢?还有_M_value行呢?等等。 - deshalder
GNU使用8个字符宽度的制表符。template使用6个空格缩进,不能使用制表符缩进。如果您寻找更深入的template,您将看到制表符,例如:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/optional#L211。 - 273K
我找不到 " _Up _M_value;",我找到的只有 "\t _Up _M_value;" - 273K
@deshalder 在三年前的第一次提交中发现了空格。这是一个代码风格评估,并在两年前通过消息“libstdc++:清理<optional>中的空格和类型特征使用”进行了修复。https://github.com/gcc-mirror/gcc/commit/6e1c9715b3142bc09e313c0d4b196694ab7ae153 - 273K
我明白了...不过还是有点奇怪,因为如果使用较小的制表符宽度,template行就没有缩进,而是在它们之后的内容缩进(例如,内容缩进可能少于6个字节);我猜如果他们使用8个空格的制表符,他们应该使用8个空格的缩进,但他们似乎使用2个空格的缩进...好吧,至少这样有点道理;虽然Clang的空格方式没有这个问题,也没有任何其他与缩进相关的问题;我不明白为什么他们(GCC)需要使事情变得复杂/混淆... - deshalder

0

所以,显然有一些GNU编码标准规定,除其他事项外,还规定任何标题前的空格八位字节都应该被替换为制表符。

然而,根据这行代码(来自GCC 10,没有任何制表符):

          _Up _M_value;

这个规则也可能被违反。

简而言之,尽管可能会伤害开发人员读取标准库头文件的能力,GNU 似乎很固执地想要保留两者:

  • 制表符默认并不总是设置为 8 个空格
  • 你必须记住每次切换到新环境时重置它们为 8 个字符
  • 在项目中其他地方可能使用非 8 个空格的制表符(并被强制这样使用,例如类似于这种情况)
  • 有些 Web 和其他工具无法控制制表符大小

等等。

嗯。


1
可能会伤害阅读标准库头文件的开发人员 - 这些开发人员可以轻松地将代码重新缩进以符合自己的偏好。问题在于,如果他们想要更改并推送更改。 - Eugene Sh.
@EugeneSh。重新调整stdlib代码?我想这将涉及拥有自己的定制stdlib版本/分支,这也很奇怪。 - deshalder
当GNU编码标准编写时(大约1985年),将制表符宽度更改为除8以外的任何值是非常不寻常的。 - zwol
我们是在谈论阅读还是贡献?后者做的开发人员比前者少得多。 - Eugene Sh.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接