C++编程规范及要求.docx
- 文档编号:29524024
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:42
- 大小:40.14KB
C++编程规范及要求.docx
《C++编程规范及要求.docx》由会员分享,可在线阅读,更多相关《C++编程规范及要求.docx(42页珍藏版)》请在冰豆网上搜索。
C++编程规范及要求
C++编码规范及要求
王卓
2008-02-21
版本第一次编写
有关C、C++的编码风格和程序质量可以参照《高质量C/C++编程》
1概述
高品质、易维护的软件开发离不开清晰严格的编码规范。
本文档详细描述C++软件开发过程中的编码规范。
本规范也适用于所有在文档中出现的源码。
2字体及颜色
强烈推荐采用VisualAssistX作为VisualStudio的辅助工具。
在编辑源码时,应该根据编辑器支持的自定义选项最大限度地满足下表定义的高亮规范。
类型
颜色
举例
注释
R0;G128;B0(深绿)
.
类、结构、联合、枚举
R0;G0;B255(蓝)
classCMyClass,enumERRTYPE,typedefintCODE...
名空间
R0;G0;B255(蓝)
namespaceBaiY
数字
R255;G0;B0(红)
012119u0xff...
字符、字符串
R0;G128;B128(深蓝绿)
"string",'c...
宏定义、枚举值
R255;G128;B0(橙黄)
#defineUNICODE,enum{RED,GREEN,BLUE};
操作符
R136;G0;B0(棕色)
<>,=+-*/;{}()[]...
方法/函数
R136;G0;B0(棕色)
MyFunc()
变量
R128;G128;B128(中灰色)
intnMyVar;
背景
R255;G255;B255(白色)
其它
R0;G0;B0(黑色)
otherthings(通常是一个错误)
Windows平台中,应该优先使用字体:
Fixedsys,这也是操作系统UI(所有的菜单、按钮、标题栏、对话框等等)默认使用的字体。
该字体的好处很多:
1、兼容性好:
所有Windows平台都支持该字体
2、显示清晰:
该字体为点阵字体,相对于矢量字体来说在显示器中呈现的影像更为清晰。
矢量字体虽然可以自由缩放,但这个功能对于纯文本格式的程序源码来说没有任何实际作用。
而且当显示字号较小(12pt以下)时,矢量字体还有一些明显的缺陷:
文字的边缘会有严重的凹凸感。
一些笔画的比例也会失调。
开启了柔化字体边缘后,还会使文字显得模糊不清。
3、支持多语言:
Fixedsys是UNICODE字体,支持世界上几乎所有的文字符号。
这对编写中文注释是很方便的。
3文件结构
3.1文件头注释
所有C++的源文件均必须包含一个规范的文件头,文件头包含了该文件的名称、功能概述、作者、版权和版本历史信息等内容。
标准文件头的格式为:
/*!
@file
*******************************************************************************
模块名:
<文件所属的模块名称>
文件名:
<文件名>
相关文件:
<与此文件相关的其它文件>
文件实现功能:
<描述该文件实现的主要功能>
作者:
<作者部门和姓名>
版本:
<当前版本号>
--------------------------------------------------------------------------------
备注:
<其它说明>
--------------------------------------------------------------------------------
修改记录:
日期版本修改人修改内容
YYYY/MM/DD<作者或修改者名><修改内容>
******************************************************************************/
如果该文件有其它需要说明的地方,还可以专门为此扩展一节:
/*!
@file
*******************************************************************************
模块名:
<文件所属的模块名称>
文件名:
<文件名>
相关文件:
<与此文件相关的其它文件>
文件实现功能:
<描述该文件实现的主要功能>
作者:
<作者部门和姓名>
版本:
<当前版本号>
--------------------------------------------------------------------------------
备注:
<其它说明>
--------------------------------------------------------------------------------
修改记录:
日期版本修改人修改内容
YYYY/MM/DD<作者或修改者名><修改内容>
*******************************************************************************
*项目1
-项目
-项目
===================================================================
*项目2
-项目
-项目
....
******************************************************************************/
每行注释的长度都不应该超过80个半角字符。
还要注意缩进和对其,以利阅读。
关于文件头的完整例子,如下:
/*!
@file
*******************************************************************************
模块名:
白杨string扩展库
文件名:
相关文件:
文件实现功能:
C++string类功能扩展
作者:
白杨
版本:
--------------------------------------------------------------------------------
备注:
在string的基础上构建,未添加任何数据成员
--------------------------------------------------------------------------------
修改记录:
日期版本修改人修改内容
2003/08/27白杨创建
2003/12/29白杨新增正则表达式、
operator<<操作符等功能
2004/01/28白杨新增部分函数
2004/02/02白杨新增部分函数
2004/03/11白杨新增部分函数
2004/03/29白杨新增ref(),set_size()等函数
2004/06/28白杨移植到namespaceBaiY
2004/07/15白杨新增换码/还原函数;为所有正则函
数增加perl风格的字符类
2004/07/19白杨新增vformat()函数;重写、改进
format()函数
******************************************************************************
版权所有(c)2003,2004,白杨,保留所有权利
======================================================================
to_str、from_str、to_wstr、from_wstr等函数只能做标准^ASCII^字符集的宽/窄字符转换
======================================================================
*format和vformat函数所能处理的最大字符串长度限制为MAX_STRING,如需临时改变,可以使用:
format(maxLength,fmt,...)函数和vformat(maxLength,fmt,arglist)函数
======================================================================
*支持如下ostream风格的流式输入操作,可以方便地用于将个类数据追加到串:
operator<<(char)
operator<<(BYTE)
operator<<(int)
operator<<(unsigned)
opeartor<<(long)
operator<<(unsignedlong)
operator<<(float)
operator<<(double)
operator<<(conststringEx&)
operator<<(constchar*)
operator<<(constBYTE*)
operator<<(wchar_t)
operator<<(wstringEx)
======================================================================
*支持兼容IEEE(“POSIX.2”)标准,并且能够正确处理包含0值之字符串的正则表达式功能。
同时也支持perl风格的字符类。
为此提供了以下函数:
regex_find();
regex_find_replace();
regex_find_replace_all();
regex_comp();
regex_find_with_comp();
regex_free();
-也可以通过定义宏“#defineBaiY_USE_REGEX0”禁用此功能。
-为了提高搜索效率,避免大量重复的表达式编译:
regex_find()会自动缓存最近一次使用的正则表达式(缓存的内容可以通过用空表达式调用regex_find()函数释放)。
如果需要高效率的交替搜索多个表达式,请使用regex_comp()、regex_find_with_comp()、regex_free()函数。
-对于wstringEx,还保证能够正确识别UNICODE字符类(如空白符,大小写等)。
所以在构建一个正则表达式的时候,应该尽量使用如[:
blank:
]、[:
upper:
]这样的字符类,而不是如[A-Z]这样的自定义集合。
-以下是所有POSIX字符类描述,及其对应perl字符类
POSIX类perl类描述
[:
alnum:
]字母和数字
[:
alpha:
]\a字母
[:
lower:
]\l小写字母
[:
upper:
]\u大写字母
[:
blank:
]空白字符(空格和制表符)
[:
space:
]\s所有空格符(比[:
blank:
]包含的范围广)
[:
cntrl:
]不可打印的控制字符(退格、删除、警铃...)
[:
digit:
]\d十进制数字
[:
xdigit:
]\x十六进制数字
[:
graph:
]可打印的非空白字符
[:
print:
]\p可打印字符
[:
punct:
]标点符号
-此外,perl还有以下特殊字符类:
perl类等效POSIX表达式描述
\o[0-7]八进制数字
\O[^0-7]非八进制数字
\w[[:
alnum:
]_]单词构成字符
\W[^[:
alnum:
]_]非单词构成字符
\A[^[:
alpha:
]]非字母
\L[^[:
lower:
]]非小写字母
\U[^[:
upper:
]]非大写字母
\S[^[:
space:
]]非空格符
\D[^[:
digit:
]]非数字
\X[^[:
xdigit:
]]非十六进制数字
\P[^[:
print:
]]非可打印字符
-POSIX字符类必须在方括号中工作,相反,perl字符类则必须在方括号外工作。
-在允许perl风格的正则搜索和替换中,还可以使用以下特殊字符换码序列:
\r-回车
\n-换行
\b-退格
\t-制表符
\v-垂直制表符
\"-双引号
\'-单引号
======================================================================
*支持以给定的换码符和换码表进行换码和还原操作,为此提供了2个函数:
stringEx&escape_translate(INconstcharcEscape,
INconststringExvstTransTable[][2]);
stringEx&escape_restore(INconstcharcEscape,
INconststringExvstTransTable[][2],
INboolbEraseUnknownEscapeSequence=true,
INboolbUntouchEscEsc=false);
-使用范例:
.
.
.
.
2004/07/22.
?
#include"../"?
?
.
?
?
externvoid
MyFunction(void);?
?
.
};
?
#include""
2004/07/22.
}
?
.
}
?
..
避免名字中出现数字编号
尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。
这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
3.2类/结构
除了异常类等个别情况(不希望用户把该类看作一个普通的、正常的类之情况)外,C++类/结构的命名应该遵循以下准则:
C++类/结构的命名
类的名称都要以大写字母“C”开头,后跟一个或多个单词。
为便于界定,每个单词的首字母要大写。
推荐的组成形式
类的命名推荐用"名词"或"形容词+名词"的形式,例如:
"CAnalyzer","CFastVector"....
不同于C++类的概念,传统的C结构体只是一种将一组数据捆绑在一起的方式。
传统C结构体的命名规则为:
传统C结构体的命名
传统C结构体的名称全部由大写字母组成,单词间使用下划线界定,例如:
"SERVICE_STATUS","DRIVER_INFO"....
3.3函数
函数的命名
函数的名称由一个或多个单词组成。
为便于界定,每个单词的首字母要大写。
推荐的组成形式
函数名应当使用"动词"或者"动词+名词"(动宾词组)的形式。
例如:
"GetName()","SetValue()","Erase()","Reserve()"....
保护成员函数
保护成员函数的开头应当加上一个下划线“_”以示区别,例如:
"_SetState()"....
私有成员函数
类似地,私有成员函数的开头应当加上两个下划线“__”,例如:
"__DestroyImp()"....
虚函数
虚函数习惯以“Do”开头,如:
"DoRefresh()","_DoEncryption()"
回调和事件处理函数
回调和事件处理函数习惯以单词“On”开头。
例如:
"_OnTimer()","OnExit()"....
3.4变量
变量应该是程序中使用最多的标识符了,变量的命名规范可能是一套C++命名准则中最重要的部分:
变量的命名
变量名由作用域前缀+类型前缀+一个或多个单词组成。
为便于界定,每个单词的首字母要大写。
对于某些用途简单明了的局部变量,也可以使用简化的方式,如:
i,j,k,x,y,z....
作用域前缀
作用域前缀标明一个变量的可见范围。
作用域可以有如下几种:
前缀
说明
无
局部变量
m_
类的成员变量(member)
sm_
类的静态成员变量(staticmember)
s_
静态变量(static)
g_
外部全局变量(global)
sg_
静态全局变量(staticglobal)
gg_
进程间共享的共享数据段全局变量(globalglobal)
除非不得已,否则应该尽可能少使用全局变量。
类型前缀
类型前缀标明一个变量的类型,可以有如下几种:
前缀
说明
n
整型和位域变量(number)
e
枚举型变量(enumeration)
c
字符型变量(char)
b
布尔型变量(bool)
f
浮点型变量(float)
p
指针型变量和迭代子(pointer)
pfn
特别针对指向函数的指针变量和函数对象指针(pointeroffunction)
g
数组(grid)
i
类的实例(instance)
对于经常用到的类,也可以定义一些专门的前缀,如:
std:
:
string和std:
:
wstring类的前缀可以定义为"st",std:
:
vector类的前缀可以定义为"v"等等。
类型前缀可以组合使用,例如"gc"表示字符数组,"ppn"表示指向整型的指针的指针等等。
推荐的组成形式
变量的名字应当使用"名词"或者"形容词+名词"。
例如:
"nCode","m_nState","nMaxWidth"....
3.5常量
C++中引入了对常量的支持,常量的命名规则如下:
常量的命名
常量名由类型前缀+全大写字母组成,单词间通过下划线来界定,如:
cDELIMITER,nMAX_BUFFER....
类型前缀的定义与变量命名规则中的相同。
3.6枚举、联合、typedef
枚举、联合及typedef语句都是定义新类型的简单手段,它们的命名规则为:
枚举、联合、typedef的命名
枚举、联合、typedef语句生成的类型名由全大写字母组成,单词间通过下划线来界定,如:
FAR_PROC,ERROR_TYPE....
3.7宏、枚举值
宏、枚举值的命名
宏和枚举值由全大写字母组成,单词间通过下划线来界定,如:
ERROR_UNKNOWN,OP_STOP....
3.8名空间
C++名空间是“类”概念的一种退化(相当于只包含静态成员且不能实例化的类)。
它的引入为标识符名称提供了更好的层次结构,使标识符看起来更加直观简捷,同时大大降低了名字冲突的可能性。
名空间的命名规则包括:
名空间的命名
名空间的名称不应该过长,通常都使用缩写的形式来命名。
例如,一个图形库可以将其所有外部接口存放在名空间"GLIB"中,但是将其换成"GRAPHIC_LIBRARY"就不大合适。
如果碰到较长的名空间,为了简化程序书写,可以使用:
namespacenew_name=old_long_name;
语句为其定义一个较短的别名。
4代码风格与版式
代码风格的重要性怎么强调都不过分。
一段稍长一点的无格式代码基本上是不可读的。
先来看一下这方面的整体原则:
空行的使用
空行起着分隔程序段落的作用。
空行得体(不过多也不过少)将使程序的布局更加清晰。
空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。
所以不要舍不得用空行。
在每个类声明之后、每个函数定义结束之后都要加2行空行。
在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
语句与代码行
一行代码只做一件事情,如只定义一个变量,或只写一条语句。
这样的代码容易阅读,并且方便于写注释。
"if"、"for"、"while"、"do"、"try"、"catch"等语句自占一行,执行语句不得紧跟其后。
不论执行语句有多少都要加"{}"。
这样可以防止书写失误。
缩进和对齐
程序的分界符"{"和"}"应独占一行并且位于同一列,同时与引用它们的语句左对齐。
"{}"之内的代码块在"{"右边一个制表符(4个半空格符)处左对齐。
如果出现嵌套的"{}",则使用缩进对齐。
如果一条语句会对其后的多条语句产生影响的话,应该只对该语句做半缩进(2个半角空格符),以突出该语句。
例如:
void
Function(intx)
{
?
CSessionLockiLock(*m_psemLock);
for(初始化;终止条件;更新)
?
?
?
{
?
?
?
?
?
?
?
.
}
try
?
?
?
{
?
?
?
?
?
?
?
.
}
catch(constexception&err)
{
?
?
?
?
?
?
?
.
}
catch(...)
{
?
?
?
?
?
?
?
.
}
.
}
最大长度
代码行最大长度宜控制在70至80个字符以内。
代码行不要过长,否则眼睛看不过来,也不便于打印。
长行拆分
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
例如:
if((very_longer_variable1>=very_longer_variable2)
&&(very_longer_variable3<=very_longer_variable4)
&&(very_longer_variable5<=very_longer_variable6))
{
dosomething();
}
空格的使用
关键字之后要留空格。
象"const"、"virtual"、"inline"、"case"等关键字之后至少要留一个空格,否则无法辨析关键字。
象"if"、"for"、"while"、"catch"等关键字之后应留一个空格再跟左括号"(",以突出关键字。
函数名之后不要留空格,紧跟左括号"(",以与关键字区别。
"("向后紧跟。
而")"、","、";"向前紧跟,紧跟处不留空格。
","之后要留空格,如Function(x,y,z)。
如果";"不是一行的结束符号,其后要留空格,如for(initialization;condition;u
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 编程 规范 要求