代码规范
原文链接:https://www.zhihu.com/question/265095298
1.缩进、对齐、花括号
<1>使用四个空格代替一个tab制表符,并且每个缩进等级使用一次。
<2>在操作符之间加入一个空格,函数与左括号无空格,每个形参","后加一个空格。如下:
int res = sum(2, 3);
<3>左花括号总是跟在操作符或者函数名同一行,譬如if,else,do,switch,如下:
if(NULL != point) {
}
<4>在比较运算中,将常量(譬如枚举,宏定义和NULL/0)放在左侧以避免==错误书写为=。
<5>总是使用/* */即使是单行注释。对于多行注释开头使用空格*来对齐。如下:
/*
* this is a value about age.
*/
<6>每个复合语句必须包含{},即使只有一条语句或者空语句,else总是与if的}在同一行。
<7>空while,for,do-while也要包含{}
<8>switch-case,为每个case添加一个级别的缩进。并且总是包含default分支。
<9>switch-case,当需要使用局部变量时,请在case:后使用{}将变量定义在其中。
2.声明与定义
<1>不要初始化静态和全局变量为0(或NULL),让编译器做。
<2>在同一行定义和声明所有相同类型的局部变量。
<3>当存在多个类型的变量时,按照先自定义类型(枚举,结构体,联合体等),后整型(无符号优先),
最后是浮点类型的顺序定义。如下:
typedef struct{
int age;
char* name;
}person_t, *person_pt;/*定义结构体和结构体指针类型*/
int main(void){
person_t person1;
uint16_t u16num;
float fnum1;
}
<4>总是在块的开头声明局部变量,在第一个可执行语句之前;在for循环中声明计数器变量(C99特性)。
<5>避免变量声明时通过函数调用赋值,采用先声明,后赋值的方式实现。
<6>除了char,double,float之外其余使用<stdint.h>的变量类型,带长度的整型类型,譬如uint8_t;
<7>不要直接使用函数或者结果来做条件;要将其和相对应的内容进行比较。
并且对于bool类型,应当使用 true 和false 或者!来做比较。如下:
error:if(ptr) if(a)
right: if(NULL != ptr) if(0 != a)
<8>多使用前增量(减),减少后增量,这和运行效率有关。多用++i,少用i++;
<9>使用size_t类型对长度或大小这类变量进行定义。
<10>对于不应该修改实参的情况,请使用const对形参修饰。
<11>对于不定类型的指针使用void*;
<12>总是使用sizeof,而非魔法数字。
<13>总是使用括号来表示优先级,而非默认的规则,这有利于可读性。
<14>减少使用变长数组,转而使用malloc动态分配不定长的数据。
<15>在定义指针时,总是将*和变量类型对齐 譬如使用int* ptr;而不是int *ptr;
<16>不要在第一个可执行语句之后声明变量,可以在下一个缩进级别(下一个内嵌的{}层级)开头定义
3.结构体与枚举
<1>当未使用typedef的结构体,只有名称的时候,其类型名不应带有_t;
<2>当使用typedef的结构体,有别名的时候,其原生类型名不应带_t,别名类型名应带有_t;
<3>对结构体成员初始化时,使用C99风格 = {.membera = a,.memberb = b};初始化其成员。
4.预编译与注释
<1>宏应当使用字母大写和下划线的形式书写,并且使用()对输入参数和最终结果进行保护。
<2>当宏使用多个语句的时候,使用do-while(0)形式,不过while(0)会增加一两个nop空指令。
<3>使用#if和#else时,不必像if-else那样缩进,全部对齐首格就好。并在#endif处注释是哪个#if结束了
<4>总是对CPP做检查,如下:
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* File content here */
#ifdef __cplusplus
}
#endif /* __cplusplus */
<5>对结构体成员变量的注释总是使用12*4个空格偏移开始,而对于函数头部注释,文本行则使用5*4个空格偏移。