软件编程规范CCpp.docx

上传人:b****2 文档编号:23126470 上传时间:2023-05-08 格式:DOCX 页数:81 大小:55.24KB
下载 相关 举报
软件编程规范CCpp.docx_第1页
第1页 / 共81页
软件编程规范CCpp.docx_第2页
第2页 / 共81页
软件编程规范CCpp.docx_第3页
第3页 / 共81页
软件编程规范CCpp.docx_第4页
第4页 / 共81页
软件编程规范CCpp.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

软件编程规范CCpp.docx

《软件编程规范CCpp.docx》由会员分享,可在线阅读,更多相关《软件编程规范CCpp.docx(81页珍藏版)》请在冰豆网上搜索。

软件编程规范CCpp.docx

软件编程规范CCpp

软件编程规范--C/C++篇

 

目录

目录2

前言3

1基本原则4

2.布局6

2.1文件布局6

2.2基本格式8

2.3对齐9

2.4空行空格11

2.5断行13

3.注释14

4.命名规则19

5.变量、常量与类型24

5.1变量与常量24

5.2类型27

6.表达式与语句33

7.函数与过程40

7.1参数40

7.2返回值41

7.3内部实现42

7.4函数调用45

8.可靠性47

8.1内存使用47

8.2指针使用49

8.3类和函数50

9.可测试性56

10.断言与错误处理59

前言

软件编程规范的目的是为了统一公司软件编程风格,提高软件源程序的可读性、可靠性和可重用性,提高软件源程序的质量和可维护性,减少软件维护成本,最终提高软件产品生产力。

本规范是针对C/C++语言的编程规则,其它不同编程语言可以参照此规范的基本原则。

本规范适用于公司所有产品的软件源程序,同时考虑到不同产品和项目的实际开发特性,本规范分成规则性和建议性两种:

对于规则性规范,要求所有软件开发人员严格执行;对于建议性规范,各项目编程人员可以根据实际情况选择执行。

本规范的示例都以C/C++语言给出。

本规范的内容包括:

基本原则、布局、注释、命名规则、变量常量与结构、表达式与语句、函数与过程、可靠性、可测性、断言与错误处理等。

规范最后给出了规范的模板供软件人员参考。

对本规范中所使用的术语解释如下:

规则:

编程时必须遵守的原则。

建议:

编程时必须加以考虑的原则。

说明:

对此规则或建议的必要的解释。

正例:

对此规则或建议给出的正确例子。

反例:

对此规则或建议给出的反面例子。

 

1基本原则

【原则1-1】首先为人编写程序,其次才是计算机。

说明:

这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。

【原则1-2】保持代码的简明清晰,避免过分的技巧。

说明:

简单是最美。

保持代码的简单化是软件工程化的基本要求。

不要过分追求技巧,否则会降低程序的可读性。

【原则1-3】所有的代码必须遵循ANSIC标准。

说明:

例如函数的原型声明中,必须包含类型定义。

【原则1-4】编程时首先达到正确性,其次考虑效率。

说明:

编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,最后才考虑程序的效率和资源占用。

【原则1-5】保持一致性,尽可能多的使用相同的规则。

【原则1-6】避免或少用全局变量。

说明:

过多地使用全局变量,会将模块间耦合过紧,违反模块化的要求。

【原则1-7】禁止使用GOTO语句。

【原则1-8】尽可能复用、修正老的代码。

说明:

选择代码完全重建不是一条最优的选择,如果可能,尽量选择可借用的代码,对其修改优化以达到自身要求。

【原则1-9】紧凑的代码并不能保证得到高效、稳定的机器代码。

说明:

防止患有“一行清”疾病,即为了把代码尽量写在源代码的一行上,使用一些稀奇古怪的表达式。

“多行源代码可能产生效率高的机器代码”。

【原则1-10】决不允许同样错误出现两次。

说明:

事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。

2.布局

程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。

更重要的是,统一的程序布局和编程风格,有助于提高整个项目的开发质量,提高开发效率,降低开发成本。

同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。

因此,统一的、良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而是一个涉及到产品质量,涉及到个人编程能力的提高,必须引起大家重视。

2.1文件布局

【规则2-1-1】遵循统一的布局顺序来书写头文件。

说明:

以下内容如果某些节不需要,可以忽略。

但是其它节要保持该次序。

头文件布局:

文件头(参见第三章“注释”)

#ifndef文件名_H(全大写)

#define文件名_H

其它条件编译选项

#include(依次为标准库头文件、非标准库头文件)

常量定义

全局宏

全局数据类型

类定义

模板(template)(包括C++中的类模板和函数模板)

extern声明

全局函数原型

#endif

【规则2-1-2】遵循统一的布局顺序来书写实现文件。

说明:

以下内容如果某些节不需要,可以忽略。

但是其它节要保持该次序。

实现文件布局:

文件头(参见第三章“注释”)

#include(依次为标准库头文件、非标准库头文件)

常量定义

文件内部使用的宏

文件内部使用的数据类型

全局变量

本地变量(即静态全局变量)

局部函数原型

类的实现

全局函数

局部函数

【规则2-1-3】使用注释块分离上面定义的节。

正例:

/***********************************************************

*数据类型定义*

***********************************************************/

typedefunsignedcharBOOLEAN;

/*************************************************************

*函数原型*

************************************************************/

intDoSomething(void);

【规则2-1-4】头文件必须要避免重复包含。

说明:

通过宏定义来避免重复包含。

正例:

#ifndefMODULE_H

#defineMODULE_H

[文件体]

#endif

【规则2-1-5】包含标准库头文件用尖括号<>,包含非标准库头文件用双引号“”。

正例:

#include

#include“heads.h”

 

【规则2-1-5】遵循统一的顺序书写类的定义及实现。

说明:

类的定义(在定义文件中)按如下顺序书写:

公有属性

公有函数

保护属性

保护函数

私有属性

私有函数

类的实现(在实现文件中)按如下顺序书写:

构造函数

析构函数

公有函数

保护函数

私有函数

2.2基本格式

【规则2-2-1】程序中一行的代码和注释不能超过80列。

说明:

包括空格在内不超过80列。

【规则2-2-2】if、else、elseif、for、while、do等语句自占一行,执行语句不得紧跟其后。

不论执行语句有多少都要加{}。

说明:

这样可以防止书写失误,也易于阅读。

正例:

if(varible1

{

varible1=varible2;

}

反例:

下面的代码执行语句紧跟if的条件之后,而且没有加{},违反规则。

if(varible1

【规则2-2-3】定义指针类型的数据,*应放在变量前。

正例:

float*pfBuffer;

反例:

float*pfBuffer;

〖建议2-2-1〗源程序中关系较为紧密的代码应尽可能相邻。

说明:

这样便于程序阅读和查找。

正例:

iLength=10;

iWidth=5;//矩形的长与宽关系较密切,放在一起。

strCaption=“Test”;

反例:

iLength=10;

strCaption=“Test”;

iWidth=5;

2.3对齐

【规则2-3-1】禁止使用TAB键,必须使用空格进行缩进。

缩进为4个空格。

说明:

消除不同编辑器对TAB处理的差异,有的代码编辑器可以设置用空格代替TAB键。

【规则2-3-2】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

{}之内的代码块使用缩进规则对齐。

说明:

这样使代码便于阅读,并且方便注释。

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;

}

}

2.4空行空格

【规则2-4-1】不同逻辑程序块之间要使用空行分隔。

说明:

空行起着分隔程序段落的作用。

空行得体(不过多也不过少)将使程序的布局更加清晰。

正例:

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】函数名之后不要留空格。

说明:

函数名后紧跟左括号‘(’,以与关键字区别。

【规则2-4-6】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

‘,’之后要留空格。

‘;’不是行结束符号时其后要留空格。

正例:

例子中的凵代表空格。

for凵(i凵=凵0;凵i凵<凵MAX_BSC_NUM;凵i++)

{

DoSomething(iWidth,凵iHeight);

}

【规则2-4-7】注释符与注释内容之间要用一个空格进行分隔。

正例:

/*注释内容*/

//注释内容

反例:

/*注释内容*/

//注释内容

2.5断行

【规则2-5-1】长表达式(超过80列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。

拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

说明:

条件表达式的续行在第一个条件处对齐。

for循环语句的续行在初始化条件语句处对齐。

函数调用和函数声明的续行在第一个参数处对齐。

赋值语句的续行应在赋值号处对齐。

正例:

if((iFormat==CH_A_Format_M)

&&(iOfficeType==CH_BSC_M))//条件表达式的续行在第一个条件处对齐

{

DoSomething();

}

for(long_initialization_statement;

long_condiction_statement;//for循环语句续行在初始化条件语句处对齐

long_update_statement)

{

DoSomething();

}

//函数声明的续行在第一个参数处对齐

BYTEReportStatusCheckPara(HWNDhWnd,

BYTEucCallNo,

BYTEucStatusReportNo);

//赋值语句的续行应在赋值号处对齐

fTotalBill=fTotalBill+faCustomerPurchases[iID]

+fSalesTax(faCustomerPurchases[iID]);

【规则2-5-2】函数声明时,类型与名称不允许分行书写。

正例:

externdoubleFARCalcArea(doubledWidth,doubledHeight);

反例:

externdoubleFAR

CalcArea(doubledWidth,doubledHeight);

3.注释

注释有助于理解代码,有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息,而不是仅仅代码的表面意义的简单重复。

【规则3-1】C语言的注释符为“/*…*/”。

C++语言中,多行注释采用“/*…*/”,单行注释采用“//…”。

【规则3-2】一般情况下,源程序有效注释量必须在20%以上。

说明:

注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息,而不是仅仅代码的表面意义的简单重复。

【规则3-3】注释使用中文。

说明:

对于特殊要求的可以使用英文注释,如工具不支持或国际化版本。

【规则3-4】文件头部必须进行注释,包括:

.h文件、.c文件、.cpp文件、.inc文件、.def文件、编译说明文件.cfg等。

说明:

注释必须列出:

版权信息、文件标识、内容摘要、版本号、作者、完成日期、修改信息等。

正例:

下面是文件头部的中文注释:

/*********************************************************************

*版权所有(C)2001,南京汉德森科技股份有限公司。

*

*文件名称:

//文件名

*文件标识:

//见配置管理计划书

*内容摘要:

//简要描述本文件的内容,包括主要模块、函数及其功能的说明

*其它说明:

//其它内容的说明

*当前版本:

//输入当前版本

*作者:

//输入作者名字及单位

*完成日期:

//输入完成日期,例:

2000年2月25日

*

*修改记录1:

//修改历史记录,包括修改日期、修改者及修改内容

*修改日期:

*版本号:

*修改人:

*修改内容:

*修改记录2:

**********************************************************************/

下面是文件头部的英文注释:

/***********************************************************************

*Copyright(C)2001,HandsonCo.,Ltd.

*

*FileName:

//文件名(注释对齐)

*FileMark:

//见配置管理计划书

*Description:

//简要描述本文件的内容,完成的主要功能

*Others:

//其它内容的说明

*Version:

//输入当前版本

*Author:

//输入作者名字及单位

*Date:

//输入完成日期,例:

2001-12-12

*

*History1:

//修改历史记录,包括修改日期、修改者及修改内容

*Date:

*Version:

*Author:

*Modification:

*History2:

**********************************************************************/

【规则3-5】函数头部应进行注释,列出:

函数的目的/功能、输入参数、输出参数、返回值、访问和修改的表、历史信息等。

说明:

注释必须列出:

函数名称、功能描述、输入参数、输出参数、返回值、修改信息等。

正例:

下面是函数头部的中文注释:

/**********************************************************************

*函数名称:

//函数名称

*功能描述:

//函数功能、性能等的描述

*访问的表:

//(可选)被访问的表,此项仅对于有数据库操作的程序

*修改的表:

//(可选)被修改的表,此项仅对于有数据库操作的程序

*输入参数:

//输入参数说明,包括每个参数的作用、取值说明及参数间关系

*输出参数:

//对输出参数的说明。

*返回值:

//函数返回值的说明

*其它说明:

//其它说明

*修改日期版本号修改人修改内容

*-----------------------------------------------

*2002/08/01V1.0XXXXXXXX

***********************************************************************/

下面是函数头部的英文注释:

/**********************************************************************

*Function:

//函数名称(注释对齐)

*Description:

//函数功能、性能等的描述

*TableAccessed:

//(可选)被访问的表,此项仅对于有数据库操作的程序

*TableUpdated:

//(可选)被修改的表,此项仅对于有数据库操作的程序

*Input:

//输入参数说明,包括每个参数的作用、取值说明以及参数间关系

*Output:

//对输出参数的说明

*Return:

//函数返回值的说明

*Others:

//其它说明

*ModifyDateVersionAuthorModification

*-----------------------------------------------

*2002/08/01V1.0XXXXXXXX

**********************************************************************/

【规则3-6】包含在{}中代码块的结束处应加注释,便于阅读。

特别是多分支、多重嵌套的条件语句或循环语句。

说明:

此时注释可以用英文,方便查找对应的语句。

正例:

voidMain()

{

if(…)

{

while(…)

{

}/*endofwhile(…)*///指明该条while语句结束

}/*endofif(…)*///指明是哪条语句结束

}/*endofvoidmain()*///指明函数的结束

【规则3-7】保证代码和注释的一致性。

修改代码同时修改相应的注释,不再有用的注释要删除。

【规则3-8】注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

说明:

在使用缩写时或之前,应对缩写进行必要的说明。

正例:

如下书写比较结构清晰

/*获得子系统索引*/

iSubSysIndex=aData[iIndex].iSysIndex;

/*代码段1注释*/

[代码段1]

/*代码段2注释*/

[代码段2]

反例1:

如下例子注释与描述的代码相隔太远。

/*获得子系统索引*/

iSubSysIndex=aData[iIndex].iSysIndex;

反例2:

如下例子注释不应放在所描述的代码下面。

iSubSysIndex=aData[iIndex].iSysIndex;

/*获得子系统索引*/

反例3:

如下例子,显得代码与注释过于紧凑。

/*代码段1注释*/

[代码段1]

/*代码段2注释*/

[代码段2]

【规则3-9】全局变量要有详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

正例:

/*

*变量作用:

(错误状态码)

*变量范围:

例如0-SUCCESS1-Tableerror

*访问说明:

(访问的函数以及方法)

*/

BYTEg_ucTranErrorCode;

【规则3-10】注释与所描述内容进行同样的缩排。

说明:

可使程序排版整齐,并方便注释的阅读

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1