C编程规范

排版

较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

在两个以上的关键字、变量、常量进行对等操作时,他们之间的操作符之前、之后或前后要加空格;进行非对等操作时,如果是关系密切的立即操作符,后不应加空格。

  • 逗号、分号只在后面加空格
  • 比较操作符,赋值操作符“=”、“+=”,算术操作符“+”、“-”,逻辑操作符“&&”、“&”,位域操作符“<<”、“^”等双目运算符前后加空格
  • “!”、“~”、“++”、“--”、“&”(地址运算符)等单目操作符前后不加空格
  • “->”、“.”前后不加空格
  • if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显

注释

注释应与其描述的代码相近,对代码的注释应放在其上方或右方相邻位置,不可放在下面。如放在上方则需与其上面的代码用空行隔开。

标识符命名

标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

  • 较短的单词可以通过去掉元音形成缩写
  • 较长的单词可取单词的头几个字母形成缩写

不要使用大小写与下划线混排的命名方式,用做特殊标识如成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。

用正确的反义词组命名具有互斥意义的变量或相反动作的函数:

add remove
begin end
create destroy
insert delete
first last
get release
increment decrement
put get
add delete
lock unlock
open close
min max
old new
start stop
next previous
source target
show hide
send receive
source destination
cut paste
up down

可读性

注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不用直接使用数字,必须用有意义的枚举或宏来代替。

变量、结构

严禁使用未经初始化的变量作为右值。

结构的功能要单一,是针对一种事务的抽象,不要设计面面俱到、非常灵活的数据结构。

编程时,要注意数据类型的强制转换。

函数、过程

防止将函数的参数作为工作变量。将函数的参数作为工作变量,有可能错误的改变参数内容。对于必须改变的参数,最好先用局部变量代之,最后再将改局部变量的内容赋给该参数。

函数的规模尽量限制在200行以内。

一个函数仅完成一件功能,不要设计面面俱到的函数。

为简单功能编写函数。

函数的功能应该是可以预测的,也就是只要输入输入数据相同就应产生同样的输出。函数的static局部变量是函数的内部存储器,有可能使函数功能不可预测。然而,函数的返回值为指针类型时,则必须是static局部变量的地址作为返回值。

避免设计多参数函数,不使用的参数从接口中去掉。

非调度函数应减少或防止控制参数,尽量只使用数据参数。

检查函数所有参数输入、非参数输入(如数据文件、公共变量等)的有效性。

函数名应准确描述函数的功能,使用动宾词组为执行某操作的函数命名。如果是OPP方法,可以只有动词(名词是对象本身)。

在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换。

改进模块中函数的结构,降低函数见的耦合度,并提高函数的独立性以及代码的可读性、效率和维护性。优化函数结构时,要遵守以下原则:

  • 不能影响函数模块功能的实现
  • 仔细考察模块或函数出错处理及模块的性能要求并进行完善
  • 通过分解或合并函数来改进软件结构
  • 考察函数的规模,过大的要进行分解
  • 降低函数间接口的复杂度
  • 不同层次的函数调用要有合理的扇入、扇出。
  • 函数功能应可预测
  • 提高函数内聚(单一功能的函数内聚最高)

可测性

使用断言来发现软件问题,提高代码可测性。

程序效率

在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。

循环体内工作量最小化。

在多重循环中,应将最忙的循环放在最内层。

尽量减少循环嵌套层次。

避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。

质量保证

代码质量保证优先原则

  • 正确性
  • 稳定性、安全性
  • 可测试性
  • 规范、可读性
  • 全局效率
  • 局部效率
  • 个人表达方式、个人方便性

防止引用已经释放的内存空间

过程/函数中分配的内存,在过程/函数退出之前要释放。

过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。

防止内存操作越界。

认真处理程序所能遇到的各种出错情况。

系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。

系统运行之初,要对加载到系统中的数据进行一致性检查。

充分了解系统的接口之后,再使用系统提供的功能。

编程时,要防止差1错误。如把“<=”误写成“<”或“>=”误写成“>”等。

要时刻注意容易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。

有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。

时刻注意表达式是否会上溢、下溢。

使用变量时要注意其边界值的情况。

为用户提供良好的接口界面,使用户能充分的了解系统内部运行状态及有关系统出错情况。

系统应具有一定的容错能力,对一些错误事件(如用户操作错误等)能进行自动补救。

代码编辑、编译、审查

编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。

代码测试、维护

仔细设计并分析测试用例,使测试用例覆盖尽可能多的情况,以提高测试用例的效率。

尽可能模拟出程序的各种出错情况,对出错处理代码进行充分的测试。

仔细测试代码处理数据、变量的边界情况。

对自动消失的错误进行分析,搞清楚错误是如何消失的。

去除代码运行的随机性(如去掉无用的数据、代码尽可能防止并注意函数中的“内部寄存器”等),让函数运行的结果可预测,并使出现的错误可再现。

 宏

用宏定义表达式时,要使用完备的括号。

将宏定义的多条表达式放在大括号中。

使用宏时,不允许参数发生变化。

 

 

 

 

 

 

posted @ 2020-04-09 17:00  溪嘉嘉  阅读(407)  评论(0编辑  收藏  举报