58、【OS】【Nuttx】编码规范解读(六)
背景
接之前 blog
53、【OS】【Nuttx】编码规范解读(一)
54、【OS】【Nuttx】编码规范解读(二)
55、【OS】【Nuttx】编码规范解读(三)
56、【OS】【Nuttx】编码规范解读(四)
57、【OS】【Nuttx】编码规范解读(五)
分析了行宽格式,注释要求,花(圆)括号风格,全局变量,结构体等,下面继续来分析上次没分析完的结构体
Nuttx 编码规范
结构体
结构体命名
接上篇 blog 57、【OS】【Nuttx】编码规范解读(五)
4、 避免在类型定义中定义结构体,推荐将结构体定义和类型定义分开,以减少头文件之间的依赖关系,此时结构体指针可以通过前向引用的方式在头文件中声明,而不需要包含定义类型的文件
举例如下:
// module_a.h
struct module_b_struct; // 前向声明
typedef struct module_b_struct* ModuleBHandle; // 类型定义
void functionUsingModuleB(ModuleBHandle handle);// module_b.h
struct module_b_struct {int data;// 其他成员...
}; // 结构体定义
在这种情况下,module_a.h 不需要包含 module_b.h,只需前向声明即可,这样可以减少头文件之间的依赖关系,加快构建速度,但也会有弊端,假如结构体名字改了,要改很多头文件(霰弹式修改)
5、所有结构体名后缀以 _s 结尾
6、老生常谈的命名简洁,模块名称前缀,字母小写,减少使用下划线
结构体字段命名
- 结构体字段命名和局部变量命名规则相同
- 每个结构体字段(包括位字段)应在单独的一行中定义
- 每个结构体字段都应该有对应的注释,解释用途和含义,注释遵循之前提到过的规则
- 小写字母,少用下划线
举例如下
可以用 typedef 为结构体创建别名,但不推荐
虽然可以在另一个结构体内定义结构体,但前提是这些内部结构体必须有命名字段,但一般情况下不推荐这样做,而是将结构体定义分开,避免嵌套定义
联合体
结构体名后缀以 _u 结尾,其他规则和结构体一样
可以用 typedef 为联合体创建别名,但不推荐
在 Nuttx 中,通常不推荐使用单字符的变量名或字段名,但对于结构体中的联合体字段(union fields)l例外,联合体字段常用 u 作为字段名,这样可以保持字段名称简短,并防止由于联合体内成员的名字过长而使代码可读性下降
枚举
枚举类型命名
枚举类型名后缀以 _e 结尾,其他规则和结构体,联合体一样
枚举值命名
- 所有枚举值必须使用大写字母
- 与其它命名规则不同,推荐在枚举值名称中使用下划线字符 _ 来分隔单词,提高可读性
- 枚举值推荐有个大写前缀,前缀标识该值属于哪个枚举类型。前缀最好来源于枚举类型名
- 枚举列表的最后一个值后面不要有逗号
示例如下
宏定义
宏命名
- 宏名全部使用大写字母
- 推荐使用下划线 _ 分隔单词,提升可读性
- 相关宏以相同的前缀开头,表示属于一个集合,减少命名冲突
- 特殊情况才用小写,比如 VOLTAGE_3p3V,p 代表小数点,CONFIG_NET_IPv6,v 表示版本号
- 函数式宏命名可以用小写风格
- #define 后只有一个空格,不要用 Tab
- 多行宏使用 \ 换行
- 多行宏的 \ 不用对齐,会增加维护难度
- 宏参数在替换时应始终用括号包裹,防止运算符优先级问题
- 如果宏执行多个操作,要用 do { … } while (0) 包裹
- 不具备直观意义的魔鬼数字必须用宏或枚举定义,不能直接写在代码中
- 宏是简单的文本替换,要注意其副作用
举例如下: