C++编程规范.docx
《C++编程规范.docx》由会员分享,可在线阅读,更多相关《C++编程规范.docx(17页珍藏版)》请在冰豆网上搜索。
C++编程规范
综合网管系统
STD-002
C++编程规范
(V1.00)
新大陆综合网管系统项目组
文档管理信息表
主题
C++编程规范
版本
1.00
内容
编程规范
关键字
编程,规范,命名
参考文档
提交时间
组别
创建人
陈志永
文档修改记录表
修改时间
修改人
修改内容
目录
1命名规则5
1.1总体命名要求5
1.2类命名5
1.3变量命名5
1.4常量(宏)命名6
1.5类方法命名6
2注释7
2.1总体说明7
2.2文件头的注释格式7
2.3说明性文件的注释格式(除文件头外)8
2.3.1类的注释格式9
2.3.2类成员属性(全局变量)的注释格式9
2.3.3一般类方法的注释10
2.3.4get/set/is等类方法的注释11
2.4.CPP/.C文件的注释格式(除文件头外)11
2.4.1类方法(函数)的注释11
2.4.2关键语句注释12
3编程风格13
3.1总体说明13
3.2头文件格式13
3.3条件判断if…else…15
3.4条件判断switch…case…default…15
3.5循环语句for16
3.6循环语句while16
3.7循环语句do…while16
3.8预编译处理16
3.9自定义消息17
3.10大括号(‘{’与‘}’)的使用17
3.11空格的使用17
1命名规则
1.1总体命名要求
任何标识符的命名必须采用英文单词缩写,不得采用汉语拼音与英文单词混合的方式,严禁标识符的命名与开发商、软件工程师等相关。
1.2类命名
类名由前缀+大写字母起始的英文单词(或单词缩写)组成,无下划线分割。
接口类的前缀为I(大写),其他类的前缀为C(大写)如:
IBenchMark,CUserInfo。
各个英文单词为有意义的单词。
1.3变量命名
采用匈牙利命名法,前缀标识+类型前缀+大写开始的英文单词组合,无下划线。
全局变量尽量用长变量,以清楚地标识含义,局部变量尽量用短名字,程序显得比较简洁。
前缀标识的取值:
类成员变量前一般应加上m_,全局变量加上g_,仅与本模块有关的变量加上l_,局部变量无前缀。
类型前缀:
整型:
n,i(int)
长整型:
l(LONG)
无符号整型:
u(unsignedint)
无符号长整型:
dw(DWORD)
字符:
ch(char)
布尔量:
b(BOOL)
浮点数:
f(FLOAT)
双精度浮点:
d(double)
字符串:
str(char*,string)
指针:
p(type*)
字节指针:
pb(byte*)
无符号指针:
pv(void*)
整型指针:
lpn(int*)
文件指针:
fp(FILE*)
如:
m_nTotalNum,m_strPath,m_bRcving,g_lOpenDate,g_dwCardNo;局部变量应尽量易懂简洁,使用常见的变量,如:
Num,nCount,i,j,k,n;临时变量如:
ltmp,ftmp,tmpStr
1.4常量(宏)命名
采用全大写的单词组合(或单词简称)标识,单词间用下划线分割,如PROCCESS_COUNT。
1.5类方法命名
使用“动词”+“名词短语”的命名格式,其中动词使用小写字母,后续单词采用首字母大写的格式,如:
analyseRiskItem()、openAccount()等。
对于直接操作类属性的方法,使用“get”、“is”和“set”表示存或取类属性,后跟大写字母起头的英文单词组合,如getFirstName(),isParent,setOrder。
2注释
2.1总体说明
Ø文字和符号“*”之间有一个空格
Ø注释的结尾无分号、句号等标点符号
Ø一般情况下,源程序有效注释量必须在20%以上;全部使用中文(模版给定的固定说明除外),不得使用其它语言进行注释
Ø注释应与其描述的代码相近,放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面
Ø对所有得变量(临时变量除外)的定义和分支语句(条件分支、循环语句、case语句等)必须编写注释
2.2文件头的注释格式
任何自己编写文件的头部都应进行说明,放在文件的最前面,格式如下:
/**
*Copyright(c)2003,新大陆综合网管Allrightsreserved
*
*文件的详细说明
*
*@author创建者姓名
*@author其它作者姓名
*@version1.009999/99/99创建者姓名
*
9.999999/99/99修改者姓名修改内容说明1
*修改内容说明2
*
9.999999/99/99修改者姓名修改内容说明
*/
格式说明:
项目
规则
备注
起始行
/**
该行不允许再有其它内容
版权行
*Copyright(c)2003,新大陆综合网管Allrightsreserved
该行不允许再有其它内容
填充行
*
该行不允许再有其它内容
说明行
*文件的详细说明
说明行中对该文件的内容进行说明,可以有多个说明行
作者行
*@author
如果有多名作者,则分写几行,创建者在第一个作者行
版本行
*@version1.009999/99/99姓名
*
9.999999/99/99姓名
“@version”为创建版本行。
创建版本行的版本号固定为1.00,日期采用“年/月/日”格式,后跟作者姓名,不止一人时,中间以“,”分隔
“
”为修改版本行。
修改版本行必须紧跟创建版本行,可以有多个修改版本行。
修改版本行的版本号使用“主版本号.次版本号”格式,并且在姓名之后说明此次修改涉及的内容,其它要求与创建版本行的要求一致
一行写不下时,第二行连续写
结束行
*/
该行不允许再有其它内容
例子:
/**
*Copyright(c)2003,新大陆综合网管Allrightsreserved
*
*工作流管理子系统的头文件,……
*
*@author李世昕
*@author雷新
*@version1.002001/8/30李世昕
*
1.012001/9/3李世昕,雷新
*优化invokeProduct()方法
*
1.022001/9/10李世昕修改登录错误
*/
2.3说明性文件的注释格式(除文件头外)
说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)应进行详细的注释。
2.3.1类的注释格式
类的声明前用如下格式的注释:
/**------------------------------
*类的详细说明
*
*@see参考类1
*@see参考类2
*/
@see列出参考的类(包括继承、类成员等,不含方法实现时调用的类),可以有多个参考行。
2.3.2类成员属性(全局变量)的注释格式
类成员属性(全局变量)注释部分有2种方式,见下表:
方式
规则
备注
简单说明方式
/**注释内容*/
属性定义
对于功能比较单一的类属性,使用简单方式进行说明
说明行以“/**”起头,以“*/”结束
定义紧跟在说明后,另起一行
详细说明方式
/**
*注释内容
*…
*/
属性定义
对于功能复杂,需要详细说明的类成员属性,使用详细方式进行解释
详细说明部分第一行必须是“/**”,不能有其它内容;中间的说明行以“*”起头,后跟说明内容;结束行必须是“*/”,也不能有其它内容。
定义紧跟在说明后,另起一行
简单说明方式的例子:
/**提示信息*/
CStringm_strMsg=null;
详细说明方式的例子:
/**
*详细的补充信息,此属性在缺省方式下不填,
*需要时通过addDetail(CStringstrDetailMsg)方法补充
*/
CStringm_strDetailMsg=null;
2.3.3一般类方法的注释
类方法注释使用如下格式:
/**
*类方法的详细使用说明
*
*@param参数1参数1的使用说明
*@param参数2参数2的使用说明
*@param参数3参数3的使用说明
*@return返回结果的说明
*@throws异常类型异常的说明
*@throws异常类型异常的说明
*@see参考类1
*@see参考类2
*/
格式说明:
项目
类型
规则
备注
起始行
必选
/**
该行不允许再有其它内容
说明行
必选
*说明内容
说明行中对该方法的功能进行说明,可以有多个说明行
参数行
可选
*@param参数参数说明
一行对一个参数进行说明,可以有多个参数行
如果该方法没有任何参数,此项可省略
返回行
可选
*@return返回结果说明
对方法的返回结果进行详细说明,只允许有一个返回行,但是可以折行
如果该方法没有返回,此项可省略
异常说明行
可选
*@throws异常类型异常的说明
一行对一类异常的一种错误码进行说明,可以有多个直接或间接引发异常行。
代码使用系统预定义的代码常量,不能直接写数字。
列出异常,并说明在何种情况下产生该异常
参考行
可选
*@see参考内容
列出供参考的类或类的方法与属性,可以有多个参考行
结束行
可选
*/
该行不允许再有其它内容
例子
/**
*调用相关产品的指定方法
*
*@paramrequest请求参数
*@paramac环境参数
*@paramstrProductMethod产品方法名
*@return应用处理结果
*@throwsLogiException.codeNoEnoughParam没有合适的方法或参
*数不足时抛出异常
*@throwsSqlExceptionMainScheduler.CallProduct()抛出
*@seeAppContext
*@seeAppOutput#form
*@seeLogiException
*@seeSqlException
*/
EntityClassImpl(
constCORBA:
:
Shortid,
constchar*strName,
constCORBA:
:
WChar*pLabel,
constchar*strParentFDN,
constchar*strTableName,
constEntityClassAttrSeq&attrs,
constEntityClassModifierSeq&modifiers
);
2.3.4get/set/is等类方法的注释
对于get/set/is等直接操作类属性的方法无需逐个进行注释,只需把此类方法集中在一起做一个整体的说明即可。
如:
/**直接操作类属性方法*/
char*getName(void);
voidsetAddress(char*address);
…
2.4.CPP/.C文件的注释格式(除文件头外)
2.4.1类方法(函数)的注释
属于一个类的方法集中在一起,开始部分按如下格式注释:
//------------------------------
//ClassName成员函数
//
CMyClass:
:
CMyClass(void)
{
……
}
ClassName用具体的类名代替,其他内容不便,而且不应添加其他内容。
必须先写构造函数和析构函数。
独立的公共函数尽量避免,如果有采用如下注释:
//------------------------------
//独立函数
//
intownFunction(void)
{
……
}
2.4.2关键语句注释
对程序中的重要语句或程序段进行注释,如重要的算法,复杂的逻辑等。
格式如下:
//------------------------------
//说明内容
//…
//
程序段
第一行必须是“//------------------------------”,不能有其它内容;中间的说明行以“//”起头,后跟说明内容;结束行必须是“//”,也不能有其它内容。
之后紧跟程序段不能有空行。
说明内容中详细说明使用的算法和逻辑。
对于小于一行的简单注释采用如下格式:
//说明内容
程序段
说明内容与程序段之间不允许由空行。
3编程风格
3.1总体说明
Ø程序块要采用缩进风格编写,每一层嵌套向右侧缩进的空格数为4个或TAB(TAB取4个空格);
Ø变量声明必须放在方法实现的最前面,变量说明之后必须加空行,不许与代码交叉;
Ø相对独立的程序块之间必须加空行;
Ø较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符外划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;
Ø不允许把多个语句写在一行中,即一行只写一条语句;if、while、for、default、do等语句自占一行;
Ø严禁使用任何未经初始化的变量作为右值;
Ø全局变量要有较详细的注释,包括对其功能、取值范围、以及存取时注意事项等的说明。
Ø若函数或过程中的参数较长,则要进行适当的划分。
(可以每个参数单独占一行)
Ø注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
Ø不要使用难懂的技巧性很高的语句,除非很有必要时。
Ø在不包含注释和空行的情况下,函数的规模尽量限制在200行以内;
3.2头文件格式
文件头注释
预编译子句
INCLUDE子句
类声明
属性方法声明段(public在前,private在后)
如:
/**
*Copyright(c)2003,新大陆综合网管Allrightsreserved
*
*工作流管理子系统的头文件,……
*
*@author李世昕
*@author雷新
*@version1.002001/8/30李世昕
*
1.012001/9/3李世昕,雷新优化invokeProduct()方法
*
1.022001/9/10李世昕修改登录错误
*/
#ifndef__FILENAME_H_
#define__FILENAME_H_
#ifndefOBOUND_ORACLE
#include"obound.h"
#endif
#defineOBOUND_READONLYTRUE
#defineOBOUND_READWRITEFALSE
……
/**------------------------------
*类的详细说明
*
*@see参考类1
*@see参考类2
*/
classOMFCBound:
publicOBound
{
public:
/**
*构造函数…
*/
OMFCBound(void);
/**
*析构函数…
*/
~OMFCBound(void);
protected:
/**
*类方法的详细使用说明
*
*@parambwnd参数1的使用说明
*@paramwnd参数2的使用说明
*@paramitemId参数3的使用说明
*@return返回结果的说明
*@throws异常类型异常的说明
*@throws异常类型异常的说明
*@see参考类1
*@see参考类2
*/
oresultSubclass(CWnd*bwnd,CWnd*wnd,intitemId);
/**直接操作类属性方法开始*/
BOOLIsBound(void){returnm_isbound;}
/**是否测试…*/
BOOLm_isbound;
}
#endif
3.3条件判断if…else…
if、else和{各自单独占一行,}单独占一行,最后加注释//endif(…),(…)由具体的if条件替代。
格式为:
if(…)
{
……
}
else
{
……
}//endif(…)
3.4条件判断switch…case…default…
switch和{各自单独占一行,}单独占一行,最后加注释//endswitch。
格式为:
switch(…)
{
case…:
……
break;
……
default:
……
}//endswitch
3.5循环语句for
for和{各自单独占一行,}单独占一行,最后加注释//endfor(…;…;…),(…;…;…)由具体的for条件替代。
格式为:
for(…;…;…)
{
……
break;
……
continue;
……
}//endfor(…;…;…)
3.6循环语句while
while和{各自单独占一行,}单独占一行,最后加注释//endwhile。
格式为:
i=0;
while(…)
{
…
i++;
}//endwhile
3.7循环语句do…while
do和{各自单独占一行,}与while在一行上。
格式为:
i=0;
do
{
…
i++;
}while(…)
3.8预编译处理
每一个头文件必须增加预编译选项,格式如下:
#ifndef__FILENAME_H_
#define__FILENAME_H_
……
#endif
3.9自定义消息
自定义消息从WM_USER开始,如:
#defineMYAPP_MESSAGEWM_USER+0x1001
3.10大括号(‘{’与‘}’)的使用
类声明和各种子句一律使用起止括号均左边齐头的大括号,例如:
classCDatetime
{
…
}
if(dBalance{
…
}
3.11空格的使用
在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前,之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格;如:
等号左右必须各有一个空格
strName=null;
双目运算符左右必须各有一个空格:
strFullName=strFirstName+strLastName;
标点符号后面必须跟一个空格
标点符号包括‘,’、‘;’等,下面列出几个例子。
一行定义多个变量时,‘,’后跟空格:
inti,j;
在for循环中,‘;’后跟空格:
for(i=0;i在有多个入口参数的函数调用中,‘,’后跟一个空格:
strCustomId=getCustomId(nCustomType,strCustomName)