我最近正在回顾 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