内容发布更新时间 : 2024/12/23 11:41:20星期一 下面是文章的全部内容请认真阅读。
C语言编程规范
规则:编程时强制必须遵守的约定 原则:编程时必须坚持的指导思想 建议:编程时必须加以考虑的约定
1. 头文件
原则1.1 头文件中合适放置接口的声明,不适合放置实现。
头文件是模块或单元的对外接口,头文件中应放置对外部的声明,如对外提供的函数声明,宏定义,类型定义
使用前置声明减少#include,尽量是依赖声明而非依赖定义 原则1.2 头文件应当职责单一
原则1.3 头文件应向稳定的方向包含 头文件的包含关系是一种依赖,一般来说应当让不稳定的模块依赖稳定的模块,当不稳定的模块修改变化时不会影响稳定的模块
规则1.1 每个.c文件应当有一个同名的.h文件,用于声明对外公开的接口 如果不需要对外使用则只在.c中定义使用static约束 规则1.2 禁止头文件循环依赖,最佳是单向依赖 规则1.3 .c和.h文件禁止包含用不到的头文件 规则1.4 头文件应当自包含
规则1.5 防止头文件被多次包含,使用#define来保护,为每个头文件配置一个宏,当第一次被包含的时候定义这个宏
命名格式PROJECT_PATH_FILENAME_H 规则1.6 禁止在头文件里定义变量
规则1.7 只能通过包含头文件的方式使用其他.c提供的接口,禁止通过extern的方式使用外部函数接口和变量
建议1.1 目录名为模块名,每个模块提供一个.h文件,文件名为目录名,对外提供模块的接口
2. 函数
原则2.1 一个函数仅完成一个功能 原则2.2 重复代码应尽可能提炼成函数 规则2.1 避免函数过长,建议在50行左右
规则2.2 避免函数代码块嵌套过深,不要超4层
规则2.3 可重入函数应避免共享变量,若要使用应通过互斥收到对其保护
规则2.4 参数的合法性应由接口函数负责,为了增强安全性,调用者可以先进行校验, 规则2.5 对函数的错误返回码要全面处理 规则2.6 废弃代码及时清除
建议2.1 函数不变参数使用const
建议2.2 源文件范围内声明和定义的所有函数,除非外部可见,否则应增加static关键字
建议2.3 函数的参数个数不要太多,不超5个
3. 标识符命名和定义
原则3.1 标识符使用unix风格,单词用小写字母,每个单词用'_'连接
原则3.2 命名要清晰,有明确含义,正确使用反义词组命名具有互斥意义的变量和函数 规则3.1 文件名统一采用小写字符
规则3.2 使用名词或形容词+名词方式命名变量,使用动词或动词+名词命名函数
规则3.3 用宏定义常量数字或字符串时,用大小字母命名宏和枚举,宏不要用'_'开头,全局变量加'g'
建议3.1 尽量避免名字中出现数字
4. 变量
原则4.1 一个变量只有一个功能,不要用作多用途
原则4.2 结构功能单一,不要面面俱到的数据结构,适度灵活 原则4.3 不用或少用全局变量
规则4.1 防止局部变量与全局变量同名
规则4.2 网络通讯过程中使用结构必须注意字节序。数据成员发送前都应进行主机序到网络序的转换,接收时进行网络序到主机序的转换 规则4.3 严禁使用未初始化的变量做为右值
规则4.4 使用面向对象接口的编程思想,通过API访问数。如果本模块的数据需要对外部开发,应提供接口函数还设置,获取,同时注意全局数据访问的互斥 建议4.1 初始化变量的地方里使用的地方越进越好
5. 宏,常量
规则5.1 用宏定义表达式时要使用完备的括号
规则5.2 将宏所定义的多条表达式放在大括号中,或加上do{}while(0) 规则5.3 使用宏时,不允许参数发生变化 规则5.4 不允许使用魔鬼数字 建议5.1 应尽可能使用函数代替宏 建议5.2 用const定义常量
6. 质量
规则6.1 防止内存越界
数组大小要考虑最大情况避免分配空间不够
避免使用危险的sprintf/vsprintf/strcpy/strcat/gets操作字符串,使用相对安全的sprintf-s/strncpy/strncat/gets-s
使用memcpy/memset时一定要确保长度不越界 字符串考虑最后的'\\0'.
指针加减操作时,考虑指针类型长度 数组下标进行检查
使用sizeof或strlen计算结构和字符串长度 规则6.2 防止内存泄露
异常出口出检查内存,定时器/文件句柄/socket/队列/信号量等资源是否全部释放 删除结构指针是,必须从里层向外层顺序删除
使用指针数组时,确保在释放数组时,每个元素指针已经提前释放 避免重复分配内存
检查队列中每个成员是否释放
规则6.3 防止引用已经释放的内存空间
内存是否后把指针置为null,使用指针前进行非空判断 避免操作已经发送消息的内存
规则6.4 所有if...else if结构应该有else字句结束;switch语句应用default分支
规则6.5 函数中分配内存,退出前应释放
规则6.6 POSIX下使用execve()代替system, windows使用CreateProcess()代替system() 规则6.7 单元测试关注单元的行为而不是实现,避免针对函数的测试
7. 排版与格式
规则7.1 程序块采用缩进风格,每级缩进4个空格(tab健用空格代替) 规则7.2 相对独立的程序块之间,变量说明之后要加空行 规则7.3 一行不超过120个字符。多个短语不要写在同一行 规则7.4 注释都有/* */
头文件的注释
/************************************************* Copyright (C), 2013-2015, Lenovo. Co., Ltd.
File name: // 文件名 Author: // 作者 Version: // 版本 Date: //完成日期
Description: // 用于简要说明此程序文件完成的主要功能,与其他
// 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 *************************************************/ 函数说明注释使用如下格式,用于doxy生成文档: /**
*\\fn //函数定义 *\\berif //功能简要描述 *\\param[in] //输入参数说明 *\\param[out] //输出参数说明 *\\return //返回值 */