VC++ 编程规范.docx
- 文档编号:2839226
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:16
- 大小:27.89KB
VC++ 编程规范.docx
《VC++ 编程规范.docx》由会员分享,可在线阅读,更多相关《VC++ 编程规范.docx(16页珍藏版)》请在冰豆网上搜索。
VC++编程规范
VC++编程规范
1.编写编程规范的目的
Ø安全:
增加代码的正确性和稳定性,使它稳定可遵守编程规范可以大幅度减少各种易犯的错误和隐患。
Ø易读:
保证代码的易读性和可维护性
Ø美观:
尽量统一项目组内人员的编程风格
Ø便于代码调试和错误定位
在编码时就注意留下跟踪的线索会使错误定位和修改更加容易。
2.编程规范的作用范围
只要能写出高质量的程序,并不强求所有程序都必须完全遵循本编码规范。
原则上:
Ø外来的代码,只要测试正确,代码复查没有问题,程序文档齐全,可以有自己的规范和风格
Ø过去的程序,原则上不为了适合本规范而专门改写程序。
但是如果方便,也可以顺手做一些修改,如加一些注释。
Ø这个规范主要针对本开发组新开发的,用VC++编写的界面或业务逻辑模块的编写。
某些模块如果有自己的编程风格,请制订相应的文档加以说明。
3.命名规则
包括如下C++要素的命名:
类、结构、函数、变量、常量(包括资源、自定义消息)、宏、自定义类型等
命名的主要原则是:
Ø使用有意义的单词或多个词组合,一目了然。
不要使用人名、项目组名
Ø命名时请考虑名字的唯一性,不要使用容易引起混淆的名称。
Ø长短要合适。
多个词组合较长时,可以使用单词的缩写
Ø主要采用Windows的命名风格
1.对于类、函数和变量,每个单词的首字符大写,其余小写
2.常量和宏定义全部大写
3.自己定义的类型(使用了typedef)全部大写,指针使用LP大写前缀
不要用MyFile.cpp,test1.h,bitmap001.bmp,nByte,CClass等等没有意义的名字。
临时使用的文件的名字要用函数生成,避免使用“硬名字”,如temp.123。
不能使用程序员的姓名或缩写来命名,如yls.cpp。
3.1.类的命名
Ø以大写的C开头,采用如下格式:
CXXXYYYYY
其中XXX指的是模块名称的缩写,参见附录2。
YYYYY是类本身的名称
例如:
CAdmDlgSearchID
3.2.结构/自定义类型
Ø结构/联合命名使用typedef后必须全部大写,单词中间可以使用下划线连接。
Ø如果不使用typedef,则在全部大写的名字前加st。
Ø结构变量的命名应尽量使用该结构的缩写前缀。
前缀使用两个以上的小写字母。
Ø自己定义的类型(使用了typedef)全部大写,指针使用LP大写前缀
3.3.函数
Ø使用动宾词组表达函数实际所作的事
Ø同名的函数(重载函数)在功能上应该完全相同,在参数上的差别也应一目了然
Ø不得出现名字非常相近但功能不同的函数.如CreatePage1(),CreatePage2()等
3.4.变量
变量命名原则上使用匈牙利命名法,一般由“前缀+类型修饰+主体”等部分组成,如:
g_strRegHome
Ø前缀(以下划线分割)
g_:
表示全局变量(包含全局静态变量)如:
g_lpEnv
t_:
表示线程的全局变量:
如:
int__declspec(thread)t_nCount
m_:
表示类成员变量(包含类静态变量)如:
m_dwFlags
g_str:
表示全局的字符串常量如:
constTCHARg_strRegHome[]=_T(“Software\\Founder\\FounderAuthorTool\\4.0”);
Ø类型修饰(小写字母),参见附录1。
Ø主体使用一个或多个单词表示变量代表的确切含义,参见下面的大小写规则
窗口菜单句柄等命名:
hWndxxxx,hMenuxxxx
3.5.常量(包括资源、自定义消息,枚举,宏等)
Ø宏定义和常量全要用大写
Ø自定义的消息WM_A_
Ø资源ID的命名:
参见附录2:
资源ID的命名。
Ø枚举类型:
命名方式类似结构,相应的前缀为enum。
枚举值的命名一律大写(等同于宏)。
枚举变量的命名按整数命名。
Ø内部的限制量,如列表的最大长度,文件名的最大长度等,统一使用MAX_xxxx_xxxx_LEN来命名,并集中放置在一个头文件中。
数据库相关的限制值放在另一个头文件中定义。
4.编程规则
4.1.类
Ø对自己定义的复杂类一定提供构造和析构函数,
Ø析构函数前一律加virtual,防止因继承而产生的memoryleak。
(有两种特殊情况:
1.部支持位拷贝。
2.某些特殊情况析构函数必须不是虚函数?
?
?
)
Ø在构造函数中初始化所有的成员变量,在析构函数中删除可能申请的内存空间。
Ø推荐采用公开的Get/Set函数对成员变量进行存储,而把成员变量设成protected或者private,并加上注释。
Ø声明成员函数和变量时要按功能分组,给外部用的要排在前面
Ø类的继承深度不要超过4层
Ø类的功能要单一,公共函数个数一般要小于20个(专门用于保存数据的类除外)内部protected函数以及private函数个数一般应小于20个
4.2.函数
Ø长度一般禁止超过200行
Ø必须检查输入值是否合法
Ø实现(成员)函数功能之前必须使用ASSERT()对输入参数的合法性进行检查,尤其你定义的(成员)函数给别人调用时,要判断其合法性。
Ø函数返回值。
函数有返回值的时候,一般需要对返回值进行判断,除非有充分的理由确认一定能执行成功。
根据返回值的结果决定后续的操作。
特别指出的是:
new/CoCreateInstance一个对象之后,一定要判断对象是否创建成功。
如果不成功,如何处理,如果成功如何处理。
Ø调用函数时要严格按照接口规范调用,调用后要判断执行情况,并做适当的错误处理(稍后会给出错误和异常处理规范)。
Ø函数出口。
为了程序跟踪调试方便,所有函数请尽量保持最少的出口,如果可能,请保持一个出口。
4.3.变量
Ø初始化。
当声明一个变量时,编译器是不会自动将之清零的,所以务必要自己初始化一下变量。
Ø布尔变量统一使用BOOL(TRUE,FALSE),不要使用bool(true,false)
在VC4.2及之前版本,sizeof(bool)=4.
在VC5及更高的版本,sizeof(bool)=1,
而在VC中,BOOL定义为int型
Ø一律用显式类型转换
Øfloat和BOOL禁止用"=="判断。
BOOL应该用逻辑运算关系符,而float应该用差值区间来判断“相等”。
Ø在涉及永久存储和必须确保数据结构的长度不变的情况下,一定要使用固定长度的数据类型,比如__int8,__int16,__int32,__int64
Ø类型的长度一律用sizeof()获得
比如int的长度原来是2bytes,现在是4bytes,等IA-64出来后就会变成8bytes.
4.4.常量
禁止直接引用常量,而应该用通过#define和enum以及资源来引用。
在程序中不要直接使用常量(如0.00001、“Error!
”等),而要使用相应的枚举类型、常量定义和资源。
具体来说,对于只有相对意义的常量,请使用枚举类型;对于有绝对数值意义的常量请使用常量定义(如:
#defineCP_EPSILON0.00001);对于程序中要显示给最终用户看到的字符串常量,请使用字符串资源(如:
AfxMessageBox(“Error!
”),请改为AfxMessageBox(IDS_CP_ERROR_MSG))。
枚举和常量定义一般直接放在头文件中。
对于字符串常量,可以放在头文件中,也可以放到资源文件中。
前者的好处是便于移植(因为它跟Windows的资源没有关系),后者的好处是便于本地化(因为可以直接修改可执行文件的资源),请根据实际情况处理。
在编写简易测试程序或者记录内部调试信息时,可以直接使用字符串常量,而不必去引用资源。
4.5.指针(包括数组)
Ø指针变量声明的书写风格:
类型后面紧跟*号.
例如:
DWORD*m_pdw...//建议采用
DWORD*m_pdw...//不推荐
DWORD*m_pdw...//不推荐
Ø指针变量必须初始化。
对于类的成员变量,可以在构造函数里初始化。
对于函数内部局部变量,声明时就请初始化。
如DWORD*pdwFrame=NULL;
Ø删除指针前请判定指针是否为NULL。
删除后把指针置为NULL(即恢复初始状态)
Ø严格防止越界
对数组和缓冲区进行检查,防止越界,尤其是变长的情况下。
你申请多少空间,就只能用多少。
越界使用往往是造成程序无故突然退出的祸首,也是各种安全漏洞的根源。
禁止使用strcpy,sprintf等函数,而要用strncpy,snprintf等函数替代。
Ø同一指针new和delete时用的类型一定要完全一致
如:
–char*p=newchar[10];
int*p1=(int*)p;
–错误的删除方法:
delete[]p1;//wrong
–正确的删除方法:
delete[](char*)p1;//right
–或者:
delete[]p;//right
删数组用delete[]
new一个实例和多个实例时的delete方法不一样:
–newchar[n]和delete[]对应。
–newchar和delete对应。
例如:
–char*p=newchar[10];
delete[]p;//right
4.6.流程控制
Ø除非特别必要,一般不用goto
4.7.宏和表达式
Ø定义宏时,参数使用扩号,结果也应扩起来,
如:
#defineSUB(a,b)((a)-(b))
这可确保如下形式的调用不会出错:
3*SUB(3,4-5)
Ø如果有&&、||、!
等逻辑运算符,请把它们作用的表达式用"()"扩起来。
4.8.字符串
Ø尽量不要使用CString定义数据成员;可以使用CString定义局部临时变量。
原因:
1)由于CString的方法大都会Throw异常,而使用过程中,又每一步调用都检查是否发生异常又很不方便。
这样容易导致异常发生,而又非常难以定位错误;2)由于CString操作不停地申请、释放小块内存,将导致系统效率降低
Ø建议使用:
TCHAR,它屏蔽了字符类型(Unicode/ANSI)。
在这两种字符下,TCHAR都工作正常。
数据类型定义:
TCHAR*,TCHAR[],用固定长度数组,或者通过长度变量使用未知长度的数组。
接口参数定义:
使用BSTR,它指向的是宽字节字符串)(BSTR:
BasicSTRing)是结构化数据类型,它前面的4个Byte包含的是字符串的长度。
4.9.const的使用
Ø不需要修改的类的成员变量的成员函数,将之声明为const,这样可以保证不出现不必要的修改。
如:
DWORDCBirthDay:
:
GetBirthYear()const
{
returnm_dwYear;
}
Get函数应该用const关键字修饰。
Ø输入参数要有适当的用const修饰
当不需要修改输入参数时,应该将输入参数声明为const;一种比较重要的情况是,需要输入的参数是一个类的实例时,请使用引用,或者指针。
严禁直接传送实例,那样不仅效率低,而且易出错,不会带来任何好处。
5.程序版式
5.1.注释
Ø在你劳神的地方请加上详细的注释说明。
除了最简单的存取成员变量的Set_/Get_成员函数之外,其余大部分的函数写上注释是良好的习惯。
尽量使你的程序让
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+ 编程规范 VC 编程 规范