背景
接之前 blog
53、【OS】【Nuttx】编码规范解读(一)
54、【OS】【Nuttx】编码规范解读(二)
55、【OS】【Nuttx】编码规范解读(三)
分析了行宽格式,注释要求,花括号风格等,下面继续来分析
Nuttx 编码规范
花括号缩进例外
涉及到结构体(structure)、枚举(enumeration)、联合体(union)时,花括号不需要额外的缩进(对于 GNU 风格而言),举例如下:
缩进
Nuttx 项目中缩进的使用和 GNU 编码规范 类似,但也有点细小的差别
- 缩进的基本单位是2个空格
- 每一级的缩进都比前一级多出两个空格
- 不要使用TAB字符进行缩进,避免不同编辑器对 TAB 宽度解释不一致(如果使用,记得把编辑器的缩进调成 两个空格)
举例如下:
Tab 使用说明
虽然源文件和头文件禁止使用 TAB 进行缩进,但在如Makefile、汇编语言源文件、Kconfig文件和一些脚本文件中,允许使用 TAB 进行缩进,TAB 设置为 4 个空格
花括号对齐
花括号必须单独占一行,每级需要缩进两个空格,而且花括号本身也要缩进两个空格(GNU风格),这里就有个有趣的现象:
- 所有C语句所在列为 4*n + 2(比如 2, 6, 10…)
- 左右花括号所在列为 4*n(比如 4, 8, 12…)
- 上述特性意味着在同一缩进级别,代码行和对应的左右花括号在不同的固定列上对齐
预处理指令的缩进
- 预处理器指令的关键字(#)从第 1 列开始
- 预处理器指令也要遵循一般的缩进规则(即每级缩进2个空格),从关键字(#)后面的内容开始遵循这个缩进原则
举例如下
例外:每个头文件在开头包含了幂等性定义,这种条件编译不会引起任何缩进的变化,举例如下
圆括号
圆括号需遵循以下规则:
- 关键字后留空格:使用C语言关键字(如 if, for, switch, while, do, return 等)时,不要将左括号(直接跟在关键字后面,关键字和左括号之间要有一个空格
- 函数名与参数列表之间不要有空格
- 右括号前不要加空格
- 返回值不要加括号,除非是为了强制运算顺序
示例如下:
Nuttx 对圆括号的态度:
- 有些开发人员对运算符优先级不太有把握,因此喜欢在表达式中大量圆括号来明确指定运算顺序,而这些括号实际上不会影响运算顺序
- 虽然这样可以防止误解运算符优先级,但也让代码看起来很丑
基于以上考虑,Nuttx 不推荐为了强制运算顺序而使用不必要的括号,但也没有特定要求必须或禁止使用括号,而是建议开发人员实事求是,视具体情况来决定是否使用括号
数据和类型定义
定义和声明独占一行
示例如下
全局变量
- 全局变量是在函数外定义的变量,作用域可以跨越多个文件或仅限于单个文件
- 全局符号前如果加上 static 关键字,则该变量的作用域仅限于定义它的文件,也就是私有全局符号
- 没有 static 修饰符的全局变量可以在不同的文件间共享,这类符号被称为公共全局变量
编码规范:
- 名字要简短,避免过于冗长的变量名,比如 g_filelen 就比 g_lengthoffile 要好
- 全局变量名要以前缀 g_ 开头,以指示其为全局变量
- 如果全局变量属于某个特定模块,要在前缀中包含该模块名,比如 xyz 模块的全局变量格式为g_xyz
- 全局变量名全部使用小写字母(不用驼峰写法)
- 尽量避免在变量名中使用下划线作为分隔符,以减少下划线的使用
- 对于较长的变量名可能需要下划线分割来提高可读性,但总体上变量名还是要简短
- 尽量把全局变量封装在结构体内,以减少命名冲突
- 限制全局变量的使用,能用私有的就用私有,对外暴露用接口形式,面向接口编程
举例如下: