【规则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】注释与所描述内容进行同样的缩排。
说明:
可使程序排版整齐,并方便注释的阅读