编码规范

if中与常量进行==判断,常量放在左边

if (a == 1) /* no 判断a和1是否相等 */
if (a = 1) /*  no 将1赋值给a,并判断a是否为非0 */
if (1 == a) /*  yes 将1赋值给a,并判断a是否为非0 */

goto只能往后跳

无拘无束地使用 goto 语句可能导致程序变得不可组织且难以理解。限制 goto 语句的使用,禁止向上跳跃,确保迭代仅通过语言中提供的迭代语句实现,有助于减少代码复杂性。

goto 只能往外跳或者代码块内部跳

goto 语句引用的标签必须在 goto 语句所在代码块或包含该代码块的父级代码块中声明

私有宏放在.c,接口宏放在.h

宏表达式中的变量要用()包起来,宏表达式整体要用()包起来

宏多条表达式需要用do{}while(0)包起来

宏表达式传参时,禁止使用自增和自减

宏中尽量不要用return,break,goto等(避免内存泄漏)

魔鬼数字用常量、宏或枚举来代替

if ... else if结构以else子句结束

switch必须有default分支

无符号数不要用在自减中

size_t是无符号数

命名规范

宏用(全大写 + 蛇型)

函数名字用(模块名_大驼峰)

函数参数用小驼峰

接口全局变量用(g_+大驼峰)

私有全局变量用大驼峰

静态变量用(s_+小蛇型)

局部变量用小蛇型

指针变量p_开头, 函数指针pf_开头

内存篇

释放掉的指针要赋值NULL(避免野指针)

禁止内存泄漏(Free掉即将失去指针的地址)

  • 删除结构指针时,从底层向上层顺序删除
  • 删除指针数组时,确保每一个元素都被释放
  • 使用return break语句的宏,确保前面的资源已经释放
  • 检查队列中每个成员是否释放

性能篇

以性能为名,使设计或代码更加复杂,从而导致可读性更差,但是并没有经过验证的性能要求(比如实际的度量数据和目标的比较结果)作为正当理由,本质上对程序没有真正的好处。无法度量的优化行为其实根本不能使程序运行得更快。

将与循环无关的操作放到循环外面执行

减少不必要的指令

对于多维数组的遍历,避免跳跃式访问数组成员

增加cache的命中率

使用内存池,避免频繁向系统申请内存

避免因内存碎片化导致的内存申请耗时

排版篇

语句过长换行需要在换行处增加一级缩进

换行时完整的语句放一行,而不是根据屏幕边界

空格问题

  1. 逗号、分号只在后面加空格

    int a, b, c;
    
  2. 比较操作符、赋值操作符、算数操作符、逻辑操作符、位域操作符等双目操作符的前后加空格

if (current_time >= MAX_TIME_VALUE)
a = b + c;
a *= 2;
a = b ^ 2;
  1. “!”、“~”、“++”、“--”、“&”(地址操作符)等单目运算符前后不加空格
*p = 'a';
flag = !is_empty;
p = &mem;
i++;
  1. “->”、"."前后不加空格
p->id = pid;
  1. if、for、while、switch等与后面的括号应加空格,使if等关键字更为突出、明显
if (a >= b && c > d)

表达式次序篇

函数参数只能传输一个确定的变量值

不可以是表达式函数的返回值。避免表达式的次序问题(见下图)

表达式的次序问题是根据编译器的不同而做出不同的处理。

int i = 1;
add(i, i++); // a = 2, b = 1, a + b = 3
i=1;
add(i++, i); // a = 1, b = 2, a + b = 3
i=1;
add(i=5, i++); // a = 5, b = 1, a + b = 6
i=1;
add(i++, i=5); // a = 6, b = 5, a + b = 11
i=1;
printf("%d %d %d\n", i++, i, i++); // 2 3 1
return 0; 

void add(int a, int b)
{
	printf("a = %d\nb = %d\na + b = %d\n\n\n", a, b, a + b);	
	return ;
}

一条语句中同一个变量不能同时被赋值和被赋值

int arr[] = {0,1,2,3,4,5,6,7,8};
int i = 1, j;
j =  i++ + arr[i];
// i = 2, j = 3
i = 1;
j = arr[i] + i++;
// i = 2, j = 2

一条语句中同一个指针不能同时被赋值和被赋值

与上同理

p->task_start_fn(p++);

&&||短路求值不可靠

if ( ishigh && (x == i++))

不同编译器会产生不同的结果

  • ishigh 为否时,后一个表达式不判断,i不变
  • ishigh 为否时,后一个表达式也判断,i增加 1
posted @ 2026-03-26 23:11  小兜兜me  阅读(3)  评论(0)    收藏  举报