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分支。
时刻注意表达式是否会上溢、下溢。
使用变量时要注意其边界值的情况。
为用户提供良好的接口界面,使用户能充分的了解系统内部运行状态及有关系统出错情况。
系统应具有一定的容错能力,对一些错误事件(如用户操作错误等)能进行自动补救。
代码编辑、编译、审查
编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。
代码测试、维护
仔细设计并分析测试用例,使测试用例覆盖尽可能多的情况,以提高测试用例的效率。
尽可能模拟出程序的各种出错情况,对出错处理代码进行充分的测试。
仔细测试代码处理数据、变量的边界情况。
对自动消失的错误进行分析,搞清楚错误是如何消失的。
去除代码运行的随机性(如去掉无用的数据、代码尽可能防止并注意函数中的“内部寄存器”等),让函数运行的结果可预测,并使出现的错误可再现。
宏
用宏定义表达式时,要使用完备的括号。
将宏定义的多条表达式放在大括号中。
使用宏时,不允许参数发生变化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)