1)缩进

1)缩进

我最近正在回顾 Linux 内核编码风格指南,这让我思考:

1)缩进

制表符为 8 个字符,因此缩进也是 8 个字符。有些异端运动试图将缩进设置为 4(甚至 2!)个字符深,这类似于试图将 PI 的值定义为 3。

理由:缩进背后的整个想法是明确定义控制块的开始和结束位置。尤其是当您连续 20 个小时盯着屏幕时,您会发现如果您有较大的缩进,您会更容易看到缩进的工作原理。

现在,有些人会声称 8 个字符的缩进会使代码向右移动太远,并且难以在 80 个字符的终端屏幕上阅读。答案是,如果您需要超过 3 级的缩进,那么无论如何您都完蛋了,应该修复您的程序。

https://www.kernel.org/doc/html/v4.10/process/coding-style.html

自从我多年前第一次读到这篇文章以来,一个问题就一直萦绕在我的心头:这条规则最大的例外是什么?我个人数过最多的是 5 个,但我只看一个模块。尽管如此,我还是很好奇为什么他们没有更严格,更重要的是,他们在应用这一点时对哪种类型的代码最不严格?

如果有人擅长 Git 和正则表达式,也许他们可以计算最连续的\t' 并发布代码块。


另外,在一个与切线相关的注释中,Linus 最近在 TED 演讲中展示了这段代码:

在此输入图像描述

没错; 4 个间距的缩进,尽管他说:

制表符为 8 个字符,因此缩进也是 8 个字符。有些异端运动试图将缩进设置为 4(甚至 2!)个字符深,这类似于试图将 PI 的值定义为 3。

然而他却在这里犯下了自我异端罪。他有没有解释过他为什么这样做?他现在只用 4 格缩进进行编程吗?

答案1

目前 Linux 内核中最高的缩进级别是多少?

53在 linux-4.14.y 分支上的 drivers/pcmcia/vrc4173_cardu.c 和 sound/pci/cs46xx/dsp_spos_scb_lib.c 中,但正如您所看到的,这是注释对齐和包装函数参数,而不是使用制表符的块缩进。可以说,这是代码格式化的冰山一角。仔细看看 eclipse 格式化程序,您会发现数百个选项。

#!/bin/bash

IFS=''
MAX=0
while read -r F ; do
    FMAX=0
    FC=0
    FOC=0
    while read -r L ; do
        FC=$(echo -n "$L" | perl -pe 's/^([\t ]*)[^\t ].+$/$1/g' | wc -c)
        if [ "$FOC" -gt 0 ] ; then
            FOC="$FC"
            continue
        fi
        if [ "$FC" -gt "$FOC" ] && [ "$FC" -gt "$FMAX" ] ; then
            FMAX="$FC"
        fi
        FOC="$FC"
        if [ "$FMAX" -gt "$MAX" ] ; then
            MAX="$FMAX"
            echo "new max is $MAX in $F"
        fi
    done < "$F"
done < <(find . -iname '*.c' | xargs -I {} grep -lPm 1 "^[\t ]{50,}" "{}")

查看绝对选项卡,获胜者是 drivers/scsi/BusLogic.c20

> find . -iname '*.c' | xargs -I {} grep -HPm 1 "^\t{20,}" "{}"

或者查看绝对间距238在驱动程序/pcmcia/i82092.c

> find . -iname '*.c' | xargs -I {} grep -HPm 1 "^ {238,}" "{}"

合并到 Linux 内核中的最高级别的缩进是什么?

这很难回答,因为并非所有历史都被保留。回答“曾经合并到当前树中”很容易(但很慢)。但如果您仍然想知道这个问题的答案,请提出第二个问题,以免使这个问题变得过于宽泛。

到底为什么他们没有更严格呢?

Linux 是一种“先让它工作,然后再理清意识形态”的解决方案(它是整体的,具有不断变化的 API、封闭的 blob 等)。而且从历史上看,他们根本没有用于重要缩进的工具,git 仅在他们需要时才为内核构建。还有更重要的事情要做,但看起来对名为 checkpatch.pl 的代码进行了非详尽的格式检查“作为指导“...但是代码中仍然有一些精华,比如 dsp_spos_scb_lib.c 中的注释:

这是我做的一坨屎

...所以是的,可以进行大量清理工作,但人们宁愿不破坏有效的功能,并且如果某处存在格式错误,则代码可能也需要在该位置进行修复。

[Linus] 有没有解释过他为什么这样做?

看来他更喜欢制表符而不是空格(使用制表符更改缩进长度是一个设置,如果使用空格则重构整个代码库),但空格用于对齐包装函数而不是在第一行插入制表符,因此这使得空格与制表符的比例 (8:1) 很重要。

他现在只用 4 格缩进进行编程吗?

不;内核中的所有 c 文件都使用制表符(但有 5 个文件没有缩进);

> find . -iname '*.c' | wc -l
25575
> find . -iname '*.c' | xargs -I {} grep -m 1 "\t" "{}" | wc -l
25570
> find . -iname *.c | while read F ; do C=$(grep -c "\t" "$F"); if [ $C == 0 ] ; then echo $F ; fi done
./sound/pci/ens1371.c
./sound/isa/sb/sbawe.c
./drivers/scsi/pcmcia/aha152x_core.c
./drivers/scsi/pcmcia/fdomain_core.c
./drivers/scsi/sun3_scsi_vme.c

注意大部分内核都是c文件;

> find . -type f | perl -pe 's/.*\.//g' | sort | uniq -c | sort -nr | head
  25574 c
  20046 h
   3990 txt
   1443 S
   1391 dts
   1075 dtsi
    810 rst
    204 gitignore
    191 sh
    189 json

相关内容