作为对比和比较的元素,
git/git 代码库始终严格遵守 C89 规范,不使用 C99 初始化程序或新版 C 标准的特性。
这在 Git 2.23 (2019 年第三季度) 的
Git 编码指南 中有详细说明。
本答案说明了可能与 C89 兼容的后 C89 特性。
查看 commit cc0c429(2019年7月16日),由Junio C Hamano (gitster
)提交。
(合并于commit fe9dc6b,由Junio C Hamano -- gitster
-- 完成于2019年7月25日)
编码指南:详细说明C89后的规则
尽管我们一直坚持使用C89,但在试用了一些新的C语言特性后,发现没有人反对,因此我们在代码库中借鉴了一些方便的功能。
详细说明它们。
顺便说一下,扩展现有的变量声明规则,以更好地阅读新拼写的for循环规则。
编码指南现在包括:
即使你的编译器支持了最新版本的 C 标准,也不应使用其中的特性。
以下是一些例外情况:
自 2012 年初以来(Git v1.7.9.2),我们一直在使用
e1327023ea ,其中包括一个
enum
definition whose last element is followed by a comma。这可以像以逗号结尾的数组初始化程序一样用于减少添加新标识符时的补丁噪音。
自 2017 年中期以来(Git v2.15.0-rc0),我们已经为结构体使用了指定初始化程序(例如,“
struct t v = { .val = 'a' };
”)。有一些 C99 特性可能对我们的代码库很有用,但我们一直在犹豫是否使用它们,以避免与旧编译器不兼容。但实际上,我们并不知道人们今天是否还在使用 C99 之前的编译器。如果此补丁能够在几个版本中幸存而没有投诉,则我们可以更有信心地认为指定的初始化程序得到了我们用户群的广泛支持。这也表明其他 C99 特性可能得到了支持,但这并不是保证(例如,在 C99 存在之前,
gcc
就拥有了指定的初始化程序)。
自 2017 年中期以来(Git v2.15.0-rc0),我们已经为数组使用了指定的初始化程序(例如,“
int array[10] = { [5] = 2 }
”)。这是另一个测试气球,以查看那些编译器不支持数组指定初始化程序的人是否有抱怨。这些曾经是被禁止的,但我们没有收到任何破坏报告,并且它们被认为是安全的。
变量必须在块的开头声明,在第一个语句之前(即
-Wdeclaration-after-statement
)。
在 for 循环中声明变量 "
for (int i = 0; i < 10; i++)
" 在此代码库中仍然不允许。