VC++ 编程规范Word文档下载推荐.docx
《VC++ 编程规范Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC++ 编程规范Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
类、结构、函数、变量、常量(包括资源、自定义消息)、宏、自定义类型等
命名的主要原则是:
使用有意义的单词或多个词组合,一目了然。
不要使用人名、项目组名
命名时请考虑名字的唯一性,不要使用容易引起混淆的名称。
长短要合适。
多个词组合较长时,可以使用单词的缩写
主要采用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;
删数组用delete[]
new一个实例和多个实例时的delete方法不一样:
–newchar[n]和delete[]对应。
–newchar和delete对应。
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_成员函数之外,其余大部分的函数写上注释是良好的习惯。
尽量使你的程序让