VC++ 编程规范Word文档下载推荐.docx

上传人:b****5 文档编号:15750293 上传时间:2022-11-15 格式:DOCX 页数:16 大小:27.89KB
下载 相关 举报
VC++ 编程规范Word文档下载推荐.docx_第1页
第1页 / 共16页
VC++ 编程规范Word文档下载推荐.docx_第2页
第2页 / 共16页
VC++ 编程规范Word文档下载推荐.docx_第3页
第3页 / 共16页
VC++ 编程规范Word文档下载推荐.docx_第4页
第4页 / 共16页
VC++ 编程规范Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

VC++ 编程规范Word文档下载推荐.docx

《VC++ 编程规范Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC++ 编程规范Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

VC++ 编程规范Word文档下载推荐.docx

类、结构、函数、变量、常量(包括资源、自定义消息)、宏、自定义类型等

命名的主要原则是:

使用有意义的单词或多个词组合,一目了然。

不要使用人名、项目组名

命名时请考虑名字的唯一性,不要使用容易引起混淆的名称。

长短要合适。

多个词组合较长时,可以使用单词的缩写

主要采用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_成员函数之外,其余大部分的函数写上注释是良好的习惯。

尽量使你的程序让

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1