C语言编程规范(一)

本文简要描述了在使用C语言进行编程活动时,应该遵循的指导原则。主要目标是考虑实际活动中出现的问题以及如何采取可靠的手段以避免这些问题。

规则 1 一个文件中不要包含超过2000行的代码。
每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)。C 程序的头文件以“.h”为后缀,C 程序的定义文件以“. c”为后缀。一个文件中包含超过1000行的代码较难阅读,所以应该按照逻辑功能划分成多个文件。
此规则只适用于源代码

规则 2 文件为了防止头文件被重复引用,应当用#ifndef/#define/#endif 结构产生预处理块,建议宏定义为“_+头文件的名字+_H”。
举例:头文件的名称为lun_pub.h,其预处理宏为_LUN_PUB_H。

规则 3 说明性文件(如.h文件)/源文件/函数 头部必须包含统一风格的注释。注释中应该包含版权说明、文件名称、功能说明、版本号、作者、日期、修订说明,函数的功能、输入参数、输出参数、返回值等。

规则 4对于宏、结构体和枚举代码的注释,需要简要说明其具体的含义,最好自注释的代码。

规则 5 一行代码只做一件事情,如只定义一个变量,或只写一条语句。

规则 6 if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。

规则 7 程序块的分界符{}应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用缩进方式。

规则 8 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:

if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}

规则 9 尽可能在定义变量的同时初始化该变量(就近原则)。

规则 10 对使用typedef定义的结构体,需要在其名称后加_t;对使用typedef定义的枚举,需要在其名称后加_e。

规则 11 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。要求全局变量添加g_前缀。

规则 12 不要过分依赖C 表达式中的运算符优先规则。
括号的使用除了可以覆盖缺省的运算符优先级以外,还可以用来强调所使用的运算符。使用相当复杂的C运算符优先级规则很容易引起错误,那么这种方法就可以帮助避免这样的错误,并且可以使得代码更为清晰可读。然而,过多的括号会分散代码使其降低了可读性。
下面的方针给出了何时使用括号的建议:
1、赋值运算符的右手操作数不需要使用括号,除非右手端本身包含了赋值表达式:

x = a + b; /* acceptable */
x = (a + b); /* ( ) not required */

2、 一元运算符的操作数不需要使用括号:

x = a * -1; /* acceptable */
x = a * (-1); /* ( ) not required */

3、否则,二元和三元运算符的操作数应该是cast-expressions,除非表达式中所有运算符是相同的。

x = a + b + c; /* acceptable, but care needed */
x = f ( a + b, c ); /* no ( ) required for a + b */
if (a && b && c) /* acceptable */
x = (a + b) - (c + d);/* acceptable */
x = (a * 3) + c + d; /* acceptable */
x = (uint16_t) a + b; /* no need for ( ( uint16_t ) a ) */

4、即使所有运算符都是相同的,也可以使用括号控制运算的次序。某些运算符(如,加法和乘法)在代数学上结合律的,而在C 中未必如此。类似地,涉及混合类型的整数运算(许多规则不允许)因为整数提升的存在可以产生不同的结果。下面的例子是按照16 位的实现写成的,它描述了加法不是结合的以及表达式结构清晰的重要性:

uint16_t a = 10;
uint16_t b = 65535;
uint32_t c = 0;
uint32_t d;
d = (a + b) + c; /* d is 9; a + b wraps modulo 65536 */
d = a + (b + c); /* d is 65545 */

规则 13 变量的自加、自减运算符需要单独占一行。
下面的条款告诉我们对运算次序的依赖是如何发生的,并由此帮助我们采纳本规则。
1、自增或自减运算符
做为能产生错误的例子,考虑
x = b[i] + i++;
根据b[i] 的运算是先于还是后于i ++ 的运算,表达式会产生不同的结果。把增值运算做为单独的语句,可以避免这个问题。那么:
x = b[i] + i;
i ++;
2、函数参数
函数参数的运算次序是未指定的。
x = func ( i++, i);
根据函数的两个参数的运算次序不同,表达式会给出不同的结果。

发布了54 篇原创文章 · 获赞 73 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_44710568/article/details/105263826