CC++软件编程规范.docx
- 文档编号:515675
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:81
- 大小:54.99KB
CC++软件编程规范.docx
《CC++软件编程规范.docx》由会员分享,可在线阅读,更多相关《CC++软件编程规范.docx(81页珍藏版)》请在冰点文库上搜索。
CC++软件编程规范
软件编程规范-C/C++篇
(试用版)
国家农业信息中心
动漫部
版权所有不得复制
修订记录
日期
修订版本
描述
修改人
2010-9-8
试用版
初稿完成
吴升
目次
1范围3
2术语和定义3
2.1规则3
2.2建议3
2.3说明3
2.4正例3
2.5反例3
3基本原则3
4布局4
4.1文件布局4
4.2注释6
4.3基本格式11
4.4对齐12
4.5空行空格14
4.6断行15
5命名规则16
6变量、常量与类型20
6.1变量与常量、宏21
6.2类型24
7表达式与语句29
8函数与过程34
8.1参数35
8.2返回值36
8.3内部实现36
8.4函数调用39
9可靠性41
9.1内存使用41
9.2指针使用43
9.3类和函数44
10可测试性49
11断言与错误处理51
软件编程规范—C/C++
1前言
本规范规定了虚拟植物软件开发中C/C++语言的编程规范。
本规范适用于动漫部内使用C/C++语言编码的所有虚拟植物相关软件。
本规范自生效之日起,对以后新编写的和修改的代码有约束力。
2术语和定义
下列术语和定义适用于本标准。
2.1规则
编程时必须遵守的约定。
2.2建议
编程时必须加以考虑的约定。
2.3说明
对此规则或建议的必要的解释。
2.4正例
对此规则或建议给出的正确例子。
2.5反例
对此规则或建议给出的反面例子。
3基本原则
【原则】首先是为人编写程序,其次才是计算机。
说明:
这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。
【原则】保持代码的简明清晰,避免过分的编程技巧。
说明:
简单是最美。
保持代码的简单化是软件工程化的基本要求。
不要过分追求技巧,否则会降低程序的可读性。
【原则】所有的代码尽量遵循ANSIC标准。
说明:
所有的代码尽可能遵循ANSIC标准,尽可能不使用ANSIC未定义的或编译器扩展的功能。
【原则】编程时首先达到正确性,其次考虑效率。
说明:
编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,最后才考虑程序的效率和资源占用。
【原则】避免或少用全局变量。
说明:
过多地使用全局变量,会导致模块间的紧耦合,违反模块化的要求。
【原则】尽量避免使用GOTO语句。
【原则】尽可能重用、修正老的代码。
说明:
尽量选择可借用的代码,对其修改优化以达到自身要求。
【原则】尽量减少同样的错误出现的次数。
说明:
事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。
4布局
4.1文件布局
【规则】遵循统一的布局顺序来书写头文件。
说明:
以下内容如果某些节不需要,可以忽略。
但是其它节要保持该次序。
头文件布局:
文件头(参见第三章“注释”)
#ifndef文件名_H(全大写)
#define文件名_H
其它条件编译选项
#include(依次为标准库头文件、非标准库头文件)
常量定义
全局宏
全局数据类型
类定义
模板(template)(包括C++中的类模板和函数模板)
全局函数原型
#endif
【规则】遵循统一的布局顺序来书写实现文件。
说明:
以下内容如果某些节不需要,可以忽略。
但是其它节要保持该次序。
实现文件布局:
文件头(参见第三章“注释”)
#include(依次为标准库头文件、非标准库头文件)
常量定义
文件内部使用的宏
文件内部使用的数据类型
全局变量
本地变量(即静态全局变量)
局部函数原型
类的实现
全局函数
局部函数
【规则】头文件必须要避免重复包含。
说明:
可以通过宏定义来避免重复包含。
正例:
#ifndefMODULE_H
#defineMODULE_H
[文件体]
#endif
【规则】包含标准库头文件‘括号<>,包含非标准库头文件用双引号“”。
正例:
#include
#include“heads.h”
【规则】遵循统一的布局顺序来书写实现文件。
说明:
以下内容如果某些节不需要,可以忽略。
但是其它节要保持该次序。
实现文件布局:
文件头(参见“注释”一节)
#include(依次为标准库头文件、非标准库头文件)
常量定义
文件内部使用的宏
文件内部使用的数据类型
全局变量
本地变量(即静态全局变量)
局部函数原型
类的实现
全局函数
局部函数
4.2注释
注释有助于理解代码,有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息,而不是代码表面意义的简单重复。
【规则】C语言的注释符为“/*…*/”。
C++语言中,多行注释采用“/*…*/”,单行注释采用“//…”。
【规则】一般情况下,源程序有效注释量必须在20%以上。
说明:
注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息。
【规则】注释使用中文。
说明:
对于特殊要求的可以使用英文注释,如工具不支持中文或国际化版本时。
【规则】文件头部必须进行注释,包括:
.h文件、.c文件、.cpp文件、.inc文件、.def文件、编译说明文件.cfg等。
注释要采用统一的格式。
文件头部的中文注释:
注释中的各个字段要用空格键对齐,不要使用Tab键对齐,如果代码文件比较独立,注释中的“相关文件”可以空缺。
当代码相对比较稳定后,任何代码修改都应该加在修改纪录中,在代码的修改处也应该有相应的注释。
/*****************************************************************************
*版本所有(C)2010国家农业信息中心动漫部
*****************************************************************************
*模块名:
//模块名
*文件名:
//文件名称
*文件标识:
//配置管理计划书中确定的文件标识
*相关文件:
//和此文件有重要关联的文件
*实现功能:
//简要描述本文件的内容,包括主要模块、函数及其功能说明
*作者:
//作者名字及其部门
*版本:
//当前版本
*完成日期:
//完成日期
*其他说明:
//其他内容的说明
*****************************************************************************
*修改记录:
*日期修改记录号(或版本号)修改人修改内容(包括修改的原因及函数)
*
*****************************************************************************/
文件头部的英文注释:
/*****************************************************************************
*Copyright(C)2001,ZTECorporation
*****************************************************************************
*ModuleName:
//模块名
*FileName:
//文件名称
*FileMark:
//配置管理计划书中确定的文件标识
*Correlative:
//和此文件有重要关联的文件
*Description:
//简要描述本文件的内容,包括主要模块、函数及其功能说明
*Author:
//作者名字及其部门
*Version:
//当前版本
*Data:
//完成日期
*Others:
//其他内容的说明
*****************************************************************************
*RevisionDetails:
*ModifyDataVersionAuthorModification
*
*****************************************************************************/
【规则】函数头部应进行注释,列出:
函数的目的/功能、输入参数、输出参数、返回值等。
函数的中文注释:
/*****************************************************************************
*函数名:
//函数的名称
*功能:
//函数的功能、性能的描述
*输入参数:
//输入参数说明,包括每个参数的作用,取值及参数间的关系
*输出参数:
//函数的输出参数的说明
*返回值说明:
//函数的返回值的说明
*其他说明:
//可选项,对复杂或主要的函数是必须项
*****************************************************************************/
函数的英文注释:
/*****************************************************************************
*Function:
//函数的名称
*Description:
//函数的功能、性能的描述
*Input:
//输入参数说明,包括每个参数的作用,取值及参数间的关系
*Output:
//函数的输出参数的说明
*Return:
//函数的返回值的说明
*Other:
//可选项,对复杂或主要的函数是必须项
*****************************************************************************/
【规则】程序中的定义,申明和实现,应该按照类别分开,并按如下顺序注释。
/***************************************************************************
*IncludeFiles文件引用
***************************************************************************/
/***************************************************************************
*Macros宏定义
***************************************************************************/
/***************************************************************************
*Types类型定义
***************************************************************************/
/***************************************************************************
*ManifestConstants常量
***************************************************************************/
/***************************************************************************
*Variables全局变量
***************************************************************************/
/***************************************************************************
*Functionprototypes函数原型
***************************************************************************/
/***************************************************************************
*GlobalFunctions全局函数实现
***************************************************************************/
/***************************************************************************
*LocalFunctions本地函数实现
***************************************************************************/
【规则】包含在{}中代码块的结束处应加注释,便于阅读。
特别是多分支、多重嵌套的条件语句或循环语句。
说明:
此时注释可以用英文,方便查找对应的语句。
正例:
voidMain()
{
if(…)
{
…
while(…)
{
…
}/*endofwhile(…)*///指明该条while语句结束
…
}/*endofif(…)*///指明是哪条语句结束
}/*endofvoidmain()*///指明函数的结束
【规则】保证代码和注释的一致性。
修改代码同时修改相应的注释,不再有用的注释要删除。
【规则】注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
说明:
在使用缩写时或之前,应对缩写进行必要的说明。
正例:
如下书写比较结构清晰
/*获得子系统索引*/
iSubSysIndex=aData[iIndex].iSysIndex;
/*代码段1注释*/
[代码段1]
/*代码段2注释*/
[代码段2]
反例1:
如下例子注释与描述的代码相隔太远。
/*获得子系统索引*/
iSubSysIndex=aData[iIndex].iSysIndex;
反例2:
如下例子注释不应放在所描述的代码下面。
iSubSysIndex=aData[iIndex].iSysIndex;
/*获得子系统索引*/
反例3:
如下例子,显得代码与注释过于紧凑。
/*代码段1注释*/
[代码段1]
/*代码段2注释*/
[代码段2]
【规则】全局变量要有详细的注释,包括对其功能、取值范围、访问信息及访问时注意事项等的说明。
正例:
/*
*变量作用:
(错误状态码)
*变量范围:
例如0-SUCCESS1-Tableerror
*访问说明:
(访问的函数以及方法)
*/
BYTEg_ucTranErrorCode;
【规则】注释与所描述内容进行同样的缩排。
说明:
可使程序排版整齐,并方便注释的阅读与理解。
正例:
如下注释结构比较清晰
intDoSomething(void)
{
/*代码段1注释*/
[代码段1]
/*代码段2注释*/
[代码段2]
}
反例:
如下例子,排版不整齐,阅读不方便;
intDoSomething(void)
{
/*代码段1注释*/
[代码段1]
/*代码段2注释*/
[代码段2]
}
【规则】对分支语句(条件分支、循环语句等)必须编写注释。
说明:
这些语句往往是程序实现某一特殊功能的关键,对于维护人员来说,良好的注释有助于更好的理解程序,有时甚至优于看设计文档。
〖建议〗通过对函数或过程、变量、结构等正确的命名以及合理地组织代码结构,使代码成为自注释的。
说明:
清晰准确的函数、变量命名,可增加代码的可读性,减少不必要的注释。
〖建议〗尽量避免在注释中使用缩写,特别是不常用缩写。
说明:
在使用缩写时,应对缩写进行必要的说明。
4.3基本格式
【规则】程序中一行的代码和注释不能超过80列。
说明:
包括空格在内不超过80列。
【规则】if、else、elseif、for、while、do等语句自占一行,执行语句不得紧跟其后。
不论执行语句有多少都要加{}。
说明:
这样可以防止书写失误,也易于阅读。
正例:
if(varible1 { varible1=varible2; } 反例: 下面的代码执行语句紧跟if的条件之后,而且没有加{},违反规则。 if(varible1 【规则】定义指针类型的变量,*应放在变量前。 正例: float*pfBuffer; 反例: float*pfBuffer; 〖建议〗源程序中关系较为紧密的代码应尽可能相邻。 说明: 这样便于程序阅读和查找。 正例: iLength=10; iWidth=5;//矩形的长与宽关系较密切,放在一起。 StrCaption=“Test”; 反例: iLength=10; strCaption=“Test”; iWidth=5; 4.4对齐 【规则】禁止使用TAB键,必须使用空格进行缩进。 缩进为4个空格。 说明: 消除不同编辑器对TAB处理的差异,有的代码编辑器可以设置用空格代替TAB键。 【规则】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。 {}之内的代码块使用缩进规则对齐。 说明: 这样使代码便于阅读,并且方便注释。 dowhile语句和结构的类型化时可以例外,while条件和结构名可与}在同一行。 正例: voidFunction(intiVar) {//独占一行并与引用语句左对齐。 while(condition) { DoSomething();//与{}缩进4格 } } 反例: voidFunction(intiVar){ while(condition){ DoSomething(); }} 【规则2-3-3】声明类的时候,public、protected、private关键字与分界符{}对齐,这些部分的内容要进行缩进。 正例: classCCount { public: //与{对齐 CCount(void);//要进行缩进 ~CCount(void); intGetCount(void); voidSetCount(intiCount); private: intm_iCount; } 【规则2-3-4】结构型的数组、多维的数组如果在定义时初始化,按照数组的矩阵结构分行书写。 正例: intaiNumbers[4][3]= { 1,1,1, 2,4,8, 3,9,27, 4,16,64 } 【规则2-3-5】相关的赋值语句等号对齐。 正例: tPDBRes.wHead=0; tPDBRes.wTail=wMaxNumOfPDB-1; tPDBRes.wFree=wMaxNumOfPDB; tPDBRes.wAddress=wPDBAddr; tPDBRes.wSize=wPDBSize; 〖建议2-3-1〗在switch语句中,每一个case分支和default要用{}括起来,{}中的内容需要缩进。 说明: 使程序可读性更好。 正例: switch(iCode) { case1: { DoSomething();//缩进4格 break; } case2: {//每一个case分支和default要用{}括起来 DoOtherThing(); break; } …//其它case分支 default: { DoNothing(); break; } } 4.5空行空格 【规则】不同逻辑程序块之间要使用空行分隔。 说明: 空行起着分隔程序段落的作用。 适当的空行可以使程序的布局更加清晰。 正例: voidFoo: : Hey(void) { [Hey实现代码] } //空一行 voidFoo: : Ack(void) { [Ack实现代码] } 反例: voidFoo: : Hey(void) { [Hey实现代码] } voidFoo: : Ack(void) { [Ack实现代码] } //两个函数的实现是两个逻辑程序块,应该用空行加以分隔。 【规则2-4-2】一元操作符如“! ”、“~”、“++”、“--”、“*”、“&”(地址运算符)等前后不加空格。 “[]”、“.”、“->”这类操作符前后不加空格。 正例: ! bValue ~iValue ++iCount *strSource &fSum aiNumber[i]=5; tBox.dWidth tBox->dWidth 【规则2-4-3】多元运算符和它们的操作数之间至少需要一个空格。 正例: fValue=fOldValue; fTotal+fValue iNumber+=2; 【规则2-4-4】关键字之后要留空格。 说明: if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 【规则2-4-5】函数名之后不要留空格。 说明: 函数名后紧跟左括号‘(’,以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC 软件 编程 规范