这份规范参考了 Linux 内核代码规范,仍在完善中。
- 头文件需要用
#ifndef FILENAME_H
语句保护起来。 - 所有文件应当用 tab 而非空格缩进,tab 显示为 8 个字符宽。
- 用
#define
语句定义宏时,#define
与名字之间用空格分开,名字与值(如果有)之间用 tab 分开,位置相近的值尽量对齐。 - 函数内的局部变量尽量在第一次使用时定义,例外见第 5 条;同时定义多个局部变量时,每个变量占一行,变量名对齐。
- 函数内有几个常用局部变量名:
i
,j
,k
作为枚举变量,在 for 循环的开头定义;r
用于形如if ((r = func()) < 0)
的语句中存储返回结果;tmp
用于存储临时变量。 - 轻易不使用 typedef,具体参照 Linux 内核代码规范;除
{i|u}{8|16|32|64}
外的 typedef 类名都应当以_t
结尾,据此分辨变量名 typedef 重定义的类名。
- 需要指定大小的整型变量使用
{i|u}{8|16|32|64}
作为类型名。 - 全局的名称(类型名,函数名,变量名)需要具有描述性,并且不易与其他模块混淆(如 CMD 就是一个差的名字);如有必要,添加当前模块相关的前缀。
- 局部的名称可以比较简略,但需要有意义。
- 常量命名使用大写字母 + 下划线分隔,其他内容命名均使用小写字母 + 下划线分隔。所有结构体名出现时都会伴随 struct 关键字,可以据此分辨变量名和结构体名。
- 定义一系列常量(例如进程的状态)时可以积极使用 enum
- 所有错误码应当由一个
enum
定义在 errno.h 中, 错误码对应的消息定义在errno.c
中。