C语言编码规范
1 范围
本标准规定了C语言的软件程序编码规范,适用于BSC软件部的应用软件、通用平台软件以及底层驱动软件,但用特殊的协议软件工具SDT生成的C代码可不遵守此规范。
2 命名
命名包括模块名、常量名、标号名、函数名等。这些名字应该能反映它所代表的实际意义,使其能够见名知义,有助于对程序功能的理解。
2.1 基本要求
2.1.1 格式
使用英文,用完整单词表示,尽量不采用缩写。
2.1.2 命名的长度
一般不要过长或过短。过长会增加工作量,过短则可能有命名冲突。函数命名、驱动中的宏命名不超过31个字母,其他命名不超过15个字母,如果超过考虑缩写或改名。如果缩写,要使用大家约定俗成的命名如msglensrc等,以体现其原意。
在命名中使用缩写,一般采用下面三种方法:
抽取元音字母
task --> tsk
user --> usr
取单词意义明显的头部
maximum --> max
minimum --> min
register --> reg
先用方法二后用方法一进行处理而得
temporary --> tmp
remove --> rm
关于命名缩写,只有一个限制:如果缩写导致该名字的意义不明确,就不要使用它。
2.1.3 采用领域的规范名称
例如BSCMAC
2.2 常量、宏、枚举命名
全部用大写字母命名,在复合词里用下划线隔开每个词
例如
#define NON_ZERO 1
enum BoolEnums {
BOOL_FALSE,
BOOL_TRUE
};
2.3 变量命名
2.3.1 全局变量以g为前缀,其后每个单词的第一个字母大写,不使用下划线
例如:
int gWindowHandle;
2.3.2 局部变量所有单词小写,并用下划线分割
例如:
int timer_id
char name_str[10];
2.3.3 结构体/联合体成员变量以名词或名词短语命名,每个单词的第一个字母大写,不使用下划线
例如:
typedef struct SystemData {
int CurrentMid;
int CurrentFid;
int CurrentPid;
} SystemDataType;
2.3.4 指针变量以ptr为后缀,风格与其角一致,并且每行定义一个
例如
全局指针变量int* gListPtr
局部指针变量int* list_ptr;
数据结构成员变量int* ListPtr;
2.3.5 循环变量可采用i, j, k等不受上述规则限制
2.4 函数命名
2.4.1 文件内函数命名首个字母小写,其他单词第一个字母大写
例如
int createTimer();
2.4.2 文件间接口函数以小写单词命名,并用下划线隔开每个词
例如
int icp_f_code();
2.4.3 第一个单词尽量采用主动的动词
例如
void transfer_message();
2.5 类型命名
enum c++2.5.1 以模块名缩写(全部大写,用下划线分开)作为前缀,防止命名冲突
例如
struct BSC_SduSetupReq
{
};
2.5.2 自定义的类型以名词或名词短语命名,每个单词的第一个字母大写,不使用下划线。枚举类型以复数结尾,结构体必须采用typedef方式定义,在类型名后加后缀Type,以示其为类型
例如
enum Days {SUNDAY, MONDAY, TUESDAY, … , SATURDAY};
typedef struct RouteTable
{
} RouteTableType;
3 规则
3.1 基本原则
3.1.1 不允许把多个短语句写在一行中,即一行只写一条语句
3.1.2 每行不超出78个字符
3.1.3 嵌套的语句使用一个TAB缩进(定义为4个空格)
3.2 正确性与容错性要求
3.2.1 所有变量在调用前必须被初始化
3.2.2 对所有的外部输入,必须进行合法性检查,尤其是作为数组下标或指针偏移量的值
3.2.3 文件编译后不能有Warning
3.2.4 慎重使用强制类型转换,不同类型变量间赋值必须使用显式类型转换
例如
float f;
int i;
f = (float)i;
3.3 结构化要求
3.3.1 尽量不使用goto语句
3.3.2 尽量不使用条件表达式(?:)语句
3.3.3 避免从循环引出多个出口,小心使用continue和break
3.3.4 除了循环控制语句,不得使用逗号表达式
3.3.5 禁止使用超过两级的指针
3.3.6 一个模块的全局变量必须定义在一个结构体中,以与其他模块区分
3.3.7 do while尽量改成while类型,因do while把exit条件放到最后判断,有可能产生未及时判断错误
3.4 大括号策略
3.4.1 左括号位于关键字的正下方,与上一行缩进保持一致
3.4.2 每个括号单独占一行,并且缩进保持一致
3.4.3 if, else if, else, while, do…while, for语句块必须使用{}括起语句块内保持相同的缩进
例如
if (condition)
{
statement;
}
else
{
statement;
}
3.4.4 对于较大的代码块或多层嵌套,在右括号处应进行适当的注释
3.5 运算符
在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如>),后不应加空格。
采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格。如果语句已足够清晰,则括号内侧(即左括号后面和右括号前面)不需要加空格。多重括号间不必加空格,因为在C语言中括号已经是最清晰的标志了
示例
ifforwhileswitch等关键字与后面的括号间应加一个空格,括号内表达式和括号之间不加空格。
例如
if (condition)
while (condition)
函数名和括号之间不加空格
例如
printf(“Hello World\n”);
逗号分号只在后面加一个空格
例如
int a, b, c;
for (j=0; j < 10; j++)
结构体运算符"->""."前后不加空格
例如
abis_msg_ptr->SortId = 0; /* "->"指针前后不加空格*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。