2022年C、C++语言编程规范 .pdf
《2022年C、C++语言编程规范 .pdf》由会员分享,可在线阅读,更多相关《2022年C、C++语言编程规范 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、文件编号:项目编号:信息级别:绝密机密内部文件部门:拟制:年月日校对:年月日审核:年月日批准:年月日XXXXXX C/C+编程规范武汉烽火众智数字技术有限责任公司名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev1.0-2011.02.18) 1 文档修订历史记录日期版本说明修改者2011.02.18 V1.0 编码规范初稿方宏伟2011.03.09 V1.1 在编码规
2、范初稿的基础上, 根据项目组的讨论,进行了修改。方宏伟2011.04.01 V1.2 根据 03.31 讨论结果修改刘尚军2011.04.02 V1.3 添加可测性要求、 程序效率要求和质量保证要求刘尚军2011.04.14 V1.4 增加变量必须初始化规则4-6,修改部分编号错误吴长树名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev1.0-2011.02.18) 2
3、 目录文档修订历史记录 . 1目录 . 21 总的原则 . 32 文件命名及书写规范 . 43 数据类型规范 . 44 变量规范 . 65 宏定义规范 . 76 表达式规范 . 87 函数规范 . 98 注释编写规范 . 99 可测性要求 . 1210 程序效率要求 . 1211 质量保证要求 . 14名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.1
4、2.07) 3 1 总的原则1.1 目的编写本规范的目的是统一虹信公司网络技术事业部嵌入式软件的编程风格,提高软件源程序的可读性、可移植性和可维护性,减少软件维护成本,并作为代码走读的考核标准。1.2 定义下列定义适用于本规范。【规则】:编程时必须遵守的约定。【建议】:编程时必须考虑的约定。【说明】:对此规则或建议的必要的解释。【正例】:符合规范或建议的例子。【反例】:不符合规范或建议的例子。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - -
5、 - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 4 2 文件命名及书写规范【规则 2-1 】头文件统一使用.h 扩展名, C文件统一使用 .c 扩展名, C+ 统一使用 .cpp 扩展名。【规则 2-2 】文件名采用模块加说明的方式命名,不采用“_”、“- ”等分隔符,与C、C+ 文件对应的头文件的文件名保持一致。正例:nvrdiskwrite.c nvrdiskread.c 【规则 2-3 】.c 文件中,组织顺序按照文件注释、公用头文件、自用头文件、宏、结构联合(放在头文件中)、变量、函数原型、函数实现的顺序进行。.c 文件中,函数先
6、主函数,再子函数。【规则 2-4 】.h 文件的组织顺序:文件注释#ifndef 文件名 _H #define 文件名 _H include文件引用宏定义常量定义类型定义函数原型定义#endif 3 数据类型规范3.1 基本数据类型规范表 1 基本类型及前缀规范类型名定义该类型变量的前缀类型意义s8 s8 有符号的8bit整数u8 u8 无符号的8bit整数s16 s16 有符号的16bit整数u16 u16 无符号的16bit整数s32 s32 有符号的32bit整数u32 u32 无符号的32bit整数s64 s64 有符号的64bit整数u64 u64 无符号的64bit整数void v
7、 void 类型f32 f32 32 位浮点数f64 f64 64 位浮点数FILE* pf文件指针表 2 变量属性公共前缀规则前缀前缀意义a 数组类型变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 5 p 指针类型变量t 自定义类型变量(自定义类型包括结构、联合、枚举型)ap 存放指针的数组at 存放自定义类型变量的数组pa 指向数
8、组的指针pp 指向指针的指针变量(两维指针)pt 指向自定义类型的指针变量3.2 结构、联合、枚举规范【规则 3-1】结构,联合,枚举类型定义统一使用typedef struct ,TStructTypeName的形式,即结构名采用大小写结合的方法,在开头加上T,表明是类型定义。正例:typedef struct TagLapdErrorMsg u8 u8ErrorNo; s8 s8ErrorMsg MAX_LAPD_ERROR_MSG_LEN ; TLapdErrorMsg; 反例: typedef stuct tag_lapd_error_msg BYTE ErrorNo; CHAR Er
9、rorMsg MAX_LAPD_ERROR_MSG_LEN LapdErrorMsg; typedef stuct tagLAPDERRORMSG BYTE ErrorNo; CHAR ErrorMsg MAX_LAPD_ERROR_MSG_LEN LAPDERRORMSG; 【规则 3-2】结构、联合、枚举类型变量在变量名之前加t ,结构、联合、枚举的指针类型变量在变量名之前加pt 。正例:TLapdErrorMsg *ptErrorMsg; TLapdErrorMsg tErrorMsg; 【规则 3-3 】结构体必须保证四字节对齐,且必须保证结构体的大小为4的倍数, 不够 4字节倍数的必
10、须补齐。正例:typedef struct TagLapdErrorMsg u8 u8ErrorNo; u8 u8ErrorCode; u16 u16Reseve; TLapdErrorMsg; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 6 typedef struct TagLapdErrorMsg u8 u8ErrorNo; u
11、8 u16Reseve3; u32 u32ErrorCode; TLapdErrorMsg; 反例:typedef struct TagLapdErrorMsg u8 u8ErrorNo; u8 u8ErrorCode; TLapdErrorMsg; typedef struct TagLapdErrorMsg u8 u8ErrorNo; u32 u32ErrorCode; TLapdErrorMsg; typedef struct TagLapdErrorMsg u8 u8ErrorNo; u32 u32ErrorCode; u8 u16Reseve3; TLapdErrorMsg; 【规则
12、 3-4 】结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。【规则 3-5 】 结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。【规则 3-6 】对结构指针进行+、- 等操作时,一定要进行越界检查,赋值,内存越界。4 变量规范【规则 4-1 】变量名采用类似于匈牙利命名法的方法:作用域前缀、变量属性公共前缀(表2)、基本类型及前缀(表1)、变量的含义。变量含义采用大小写结合的办法。作用域前缀的结构为:变量属性公共前缀变量类型前缀。说明:作用域前缀规范如下:s_ :静态变量前缀g_
13、:全局变量前缀m_ :类的成员变量( 属性所对应的变量) 空:局部变量不加范围前缀正例:基本数据类型变量:u8 u8ErrorNo; /* 局部类型变量 */ u8 s_u8ErrorNo; /* 静态类型变量 */ u8 g_u8ErrorNo; /* 全局类型变量 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 7 指针类型变量
14、定义: u8 *pu8ErrorNo; /* 局部类型指针变量 */ u8 *s_pu8ErrorNo; /* 静态类型指针变量 */ u8 *g_pu8ErrorNo; /* 全局类型指针变量 */ 数组类型变量:u8 au8ErrorNo16; /* 局部数组类型变量 */ u8 s_au8ErrorNo16; /* 静态数组类型变量 */ u8 g_au8ErrorNo16; /* 全局数组类型变量 */ u8 *pau8ErrorNo16; /* 局部数组类型指针变量 */ u8 *s_pau8ErrorNo16; /* 静态数组类型指针变量 */ u8 *g_pau8ErrorNo1
15、6; /* 全局数组类型指针变量 */ 自定义类型变量:TLapdErrorMsg tErrorMsg; /* 自定义数据类型变量(结构、联合枚举) */ TLapdErrorMsg s_tErrorMsg; /* 静态自定义数据类型变量(结构、联合枚举) */ TLapdErrorMsg g_tErrorMsg; /* 全局自定义数据类型变量(结构、联合枚举) */ TLapdErrorMsg *ptErrorMsg; /* 自定义数据类型指针变量(结构、联合枚举) */ TLapdErrorMsg *s_ptErrorMsg; /* 静态自定义数据类型指针变量(结构、联合枚举) */ TL
16、apdErrorMsg *g_ptErrorMsg; /* 全局自定义数据类型指针变量(结构、联合枚举) */ 【规则 4-2 】定义指针类型的数据,*应放在变量前。正例: u8 *pu8OssReceiveData; 反例: u8* pu8OssReceiveData; 【规则 4-3 】去掉没必要的公共变量。公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。【规则 4-4 】仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。【规则 4-5 】
17、防止局部变量与公共变量同名。【规则 4-6 】变量定义之后,为防止遗忘必须进行初始化操作。5 宏定义规范【规则 5-1 】宏定义统一使用大写字母和数字,中间可以加下划线。【规则 5-2 】宏定义中如果包含表达式,表达式需用小括号括起来。【规则 5-3 】TRUE 和FALSE 的推荐定义如下:#ifndef FALSE #ifndef TRUE #define FALSE 0 #define TRUE (s32)(!0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 1
18、7 页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 8 #endif #endif 6 表达式规范【规则 6-1 】减少指针的强制类型转化。如果一定要使用的话,在转换前一定要仔细思考。【规则 6-2 】应当对指针进行合法性判断,指针变量用“=”或“! =”与 NULL 比较。说明:指针变量的零值是“空”(记为 NULL )。尽管 NULL 的值与 0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if 语句如下:正例:if (pu8Buff = NULL) /* pu8Buff与NULL 显式比
19、较,强调pu8Buff 是指针变量 */ if (pu8Buff != NULL) 反例:if (pu8Buff = 0) /* 容易让人误解pu8Buff 是整型变量 */ if (pu8Buff != 0) if (pu8Buff) /* 容易让人误解pu8Buff 是布尔变量 */ if (!pu8Buff) 【规则 6-2 】用 malloc 申请内存之后,应该立即检查指针值是否为空指针, 并强制转换后赋值给指针。用 free 释放了内存之后,立即将指针设置为NULL ,防止产生“野指针”。正例:u8 *pu8Buff = NULL; /* 申请内存示例 */ pu8Buff = (u
20、8 *)malloc(BUFF_SIZE); /* 释放内存示例 */ if(pu8Buff != NULL) free(pu8Buff) pu8Buff = NULL; 【规则 6-3 】 动态内存的申请与释放必须配对,防止内存泄漏。 在线程间通过消息传递的动态内存,必须遵守一个线程申请、另一个线程释放(或者说发消息之前申请,处理完消息之后释放)的原则。【规则 6-4 】不可将浮点变量用“=”或“! =”与任何数字比较。【规则 6-5 】对于运算符比较多的表达式或语句,用括号确定表达式的操作顺序,不使用默认的优先级。正例:为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序,如下所示
21、,word = (high 8) | low if (a | b) & (a & c) 【规则 6-6 】不要使用过多的嵌套,嵌套层次不能超过4层。如果超过 4层,应考虑重新设计程序。【规则 6-7 】低一级的程序块比上一级的代码块退后4个空格,同级程序段代码位置平齐。不要使用tab 键对齐代码,一定要使用空格键。编辑时可以把一个tab 键设成 4个空格 , 然后把 tab 键用空格键代替。采用能自动对齐格式的编辑器。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17
22、页 - - - - - - - - - 武汉烽火众智数字技术有限责任公司C/C+软件编程规范(Rev.B-2009.12.07) 9 【规则 6-8 】无论 if else、for 、while 的程序块的长度为一行还是超过一行,都要用 把程序块分割。【规则 6-9 】初始化循环的代码紧放在循环前。【规则 6-10】条件判断语句内不能有赋值语句,如if(x=y),这类语句不够明确,容易引起混淆。【规则 6-11】if 、while 等条件判断必须明确使用,=,=,!= 等判断符号。【规则 6-12】for 循环语句内的计数器不能在循环体内被修改,同时,它必须是局部变量,这样将减少出错的危险,并
23、提高程序的可读性。【规则 6-13】在代码中, 先按正常情况的路径往下写,然后再写异常情况。应该把正常情况放在if 后面而不是 else 后面。【规则 6-14】在 switch-case语句中, case 语句最后必须用break 显式地标明结束,若要继续执行下一条语句,一定要进行注释说明不用break 结束的理由,case 语句中禁止使用return直接返回 ,default不能忽略,其后要加入异常处理。【规则 6-15】switch 语句的每个分支里的语句数一般应少于30行,以提高程序的可读性。特殊情况例外。【规则 6-16】switch 中禁止直接使用数字作为case 选项 ,必须使用
24、宏定义。【规则 6-17】严禁使用未经初始化的变量作为右值。7 函数规范【规则 7-1 】函数名称采用名动结构或者动名结构,但是每个模块内部要统一采用一种风格,如SemCreate, SemDelete ,EncodeFrame等。【规则 7-2 】函数的传入参数处理不当,会产生较严重后果时,必须对参数的合法性进行必要的检查 。【规则 7-3 】函数名的长度必须控制在30字符之内。【规则 7-4 】函数定义应明确注明返回值,如果函数无返回值应明确标明void 。【规则 7-5 】函数的返回值禁止用0、1、 -1 等约定表明状态,要求用宏。【规则 7-6 】函数长度不应超过200行。如果超过 2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C、C+语言编程规范 2022 C+ 语言 编程 规范
限制150内