vc规范tmp.docx

上传人:b****8 文档编号:9354182 上传时间:2023-02-04 格式:DOCX 页数:53 大小:117.45KB
下载 相关 举报
vc规范tmp.docx_第1页
第1页 / 共53页
vc规范tmp.docx_第2页
第2页 / 共53页
vc规范tmp.docx_第3页
第3页 / 共53页
vc规范tmp.docx_第4页
第4页 / 共53页
vc规范tmp.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

vc规范tmp.docx

《vc规范tmp.docx》由会员分享,可在线阅读,更多相关《vc规范tmp.docx(53页珍藏版)》请在冰豆网上搜索。

vc规范tmp.docx

vc规范tmp

 

 

Revision1.0

版权所有,拷贝必究

Revisionhistory

版本号发行日期说明

1.02000.06.01第一版本根据资料由王红改编

 

目录

第一部编程基本规约4

第1章命名方法5

1命名原则的设定5

2命名的基本5

3直接数值使用的禁止10

第2章注释10

1各个文件中的注释11

2各个函数的注释11

3数据类型的注释12

4变量及参数的注释13

5关键处理块的注释13

第3章原代码的变更14

1表示变更的注释14

2变更方法15

第4章附录例程序17

1付.h文件的范例17

2付.c文件的范例21

第二部编程指导(一般篇)28

第1章模块化的方法29

1一个函数一个机能29

2一个机能一个函数31

3共通化(generalization)31

4函数的层次32

5函数参数的决定方法33

6函数的大小33

7函数返回处33

第2章错误处理34

1错误的等级34

2错误信息的充实35

3错误处理的优先35

4特别需注意点35

5错误恢复处理36

6多重错误处理37

第3章数据文件38

1排他控制38

2扩张性38

3输入输出的高效率化38

第4章定义40

1一个变量一个用途40

2变量名的略名40

3一个文字的变量名40

4给变量名一个正确的含义41

5资源的定义41

第5章执行文42

1goto文42

2为的副作用42

3优先顺序43

4评价顺序43

5if…else的使用43

6很长的循环45

第6章编出悦目的程序45

1文字缩进45

2列位置的整齐45

3一行的长度46

4一行复数语句的禁止46

 

第一部编程基本规约

 

第1章命名方法

命名方法之所以要标准化,主要出于以下几个目的。

1)即使只从名字,也可以判断出起什么作用?

是何种类型?

提高了可读性及可维护性。

2)避免编译及链接时的冲突/不一致,而这种冲突/不一致在把一些模块移到别的一些操作系统中时有可能发生。

3)阅读源程序以及进行调试时,某个符号属于哪一个模块,能很快的明白。

4)和用途直接有关的固有名诩的使用,能够防止由于疏忽而错误地使用于别的用途。

对于变量来说,一个用途一个变量是一个重要的原则。

1命名原则的设定

变量尽量采用匈牙利命名法,同时结合VC的语言原则。

2命名的基本

在源程序中使用的符号(外部变量,结构定义,函数名,宏定义)的名称,应该满足下列条件。

1)根据其名称,可以容易的推断他的用途。

保持名称和含义的一致,以使得从名称上可以容易地推断该符号被使用在什么用途上。

此外由于编程语言的不同,变量定义可以使用的最大的文字个数不同。

应该充分活用有限的字符来命名,不应该吝惜键盘的入力而采取暧昧的简称。

例如:

利用下划线或将每个单词的首字符大写(应尽量少用下划线),区分由复数个单词组成的名称,每个单词应尽量全写。

比如:

●PaintPolygonRegion

●ReplyMessage

●PreviousCursor

●SetMouseAction

2)根据其名称,可以容易地推断它是变量还是宏定义。

在能够使用大小写字符的编程语言中,使用下述方法来加以区别是通常的。

小字符(可以个别是大写字符)

全部大写字符

变量名

函数名

宏定义

变量名,函数名

宏定义名

CreateDate(…)

.ptrMessage

.nWindowSizeX

DF_ACK_REQUIREDX_BM_OVERFLOW_ERRORWM_RIGHT_BUTTON

3)错误码定义

错误处理是在障害容易发生的情况下特别需要注意的必须项目。

因此错误码和其他符号的在命名时应该要注意是否易于区别。

在整个项目的自始至终中要贯彻一致。

例1:

__ERROR

●SCHED_TIMEOUT_ERROR

●MEM_OVERFLOW_ERROR

例2:

ERR_

●ERR_ILLEGAL_CHARACTER

●ERR_OUT_OF_RANGE

4)根据其名称,能够推断出其所属进程及文件

大型的项目基本上是由复数个具备一定规模大小的机能模块而构成的。

就好象通常的OS是由进程调度程序,内存管理程序,文件I/Oetc模块而构成。

这种项目中,各个函数,全局变数,源文件只需根据名称就可以明确地知临危不惧其属于哪能个机能模块或文件。

例如采用下述命名方法。

●文件名:

[执行程序名]例:

DM=目录管理程序,SCHED=调度程序,:

标志文件/模块属性的名称。

例:

INIT=初期化模块,COMM=通信模块,DB=数据库处理模块

●函数名:

_.

●变量名:

_

prefix:

[执行程序名][模块名]。

例:

DM=目录管理程序,SCHED=调度程序,

INIT=初期化模块,COMM=通信模块,DB=数据库处理模块

Identifier:

标志各个函数,变量的特有属性的名称。

变量的identifier的取名法:

字符串变量:

str/buf

全局批针变量:

ptr

整型计数变量:

cnt

布尔变量:

Is/Not

函数名的定义应该使得根据函数名,能够很简单找出相应的源文件,这样维护的时候能够容易的追踪程序的流程。

比较常用的是prefix取和文件同样的名称。

Extension:

标志使用的语言或文件的类型。

“.h”,“cpp”,“.asm”

3变量的命名

一般情况下,变量的取名方式为:

有关项目的全局变量必须用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。

前缀

类型

例子

g_

GlobalVariable

.g_Servers

C

Classorstructure

CDocument,

CprintInfo

m_

Membervariable

.m_pDoc,

.m_nCustomers

VisualC++常用前缀列表:

前缀

类型

描述

例子

.ch

.char

8-bitcharacter

.chGrade

.ch

TCHAR

16-bitcharacterif_UNICODEisdefined

.chName

.b

BOOL

Booleanvalue

.bEnabled

.n

.int

Integer(sizedependentonoperatingsystem)

.nLength

.n

UINT

Unsignedvalue(sizedependentonoperatingsystem)

.nLength

.w

WORD

16-bitunsignedvalue

.wPos

.l

LONG

32-bitsignedinteger

.lOffset

.dw

DWORD

32-bitunsignedinteger

.dwRange

.p

*

Ambientmemorymodelpointer

.pDoc

.lp

FAR*

Farpointer

.lpDoc

.lpsz

LPSTR

32-bitpointertocharacterstring

.lpszName

.lpsz

LPCSTR

32-bitpointertoconstantcharacterstring

.lpszName

.lpsz

LPCTSTR

32-bitpointertoconstantcharacterstringif_UNICODEisdefined

.lpszName

.h

.handle

HandletoWindowsobject

.hWnd

.lpfn

(*fn)()

.callbackFarpointertoCALLBACKfunction

.lpfnAbort

Windows对象名称缩写:

Windows对象

例子变量

MFC类

例子对象

HWND

hWnd;

CWnd*

pWnd;

HDLG

hDlg;

CDialog*

pDlg;

HDC

hDC;

CDC*

pDC;

HGDIOBJ

HGdiObj;

CGdiObject*

pGdiObj;

HPEN

hPen;

CPen*

pPen;

HBRUSH

hBrush;

CBrush*

pBrush;

HFONT

hFont;

CFont*

pFont;

HBITMAP

HBitmap;

CBitmap*

pBitmap;

HPALETTE

HPalette;

CPalette*

pPalette;

HRGN

hRgn;

CRgn*

pRgn;

HMENU

hMenu;

CMenu*

pMenu;

HWND

hCtl;

CStatic*

pStatic;

HWND

hCtl;

CButton*

pBtn;

HWND

hCtl;

CEdit*

pEdit;

HWND

hCtl;

CListBox*

pListBox;

HWND

hCtl;

CComboBox*

pComboBox;

VisualC++常用宏定义命名列表:

前缀

符号类型

符号例子

范围

IDR_

标识多个资源共享的类型

IDR_MAINFRAME

1to0x6FFF

IDD_

对话框资源(Dialog)

IDD_SPELL_CHECK

1to0x6FFF

HIDD_

基于对话框的上下文帮助(ContextHelp)

HIDD_SPELL_CHECK

0x20001to0x26FF

IDB_

位图资源(Bitmap)

IDB_COMPANY_LOGO

1to0x6FFF

IDC_

光标资源(Cursor)

IDC_PENCIL

1to0x6FFF

IDI_

图标资源(Icon)

IDI_NOTEPAD

1to0x6FFF

ID_

IDM_

工具栏或菜单栏的命令项

ID_TOOLS_SPELLING

0x8000to0xDFFF

HID_

命令上下文帮助(CommandHelpcontext)

HID_TOOLS_SPELLING

0x18000to0x1DFFF

IDP_

消息框提示文字资源

IDP_INVALID_PARTNO

8to0xDFFF

HIDP_

消息框上下文帮助(Message-boxHelpcontext)

HIDP_INVALID_PARTNO

0x30008to0x3DFFF

IDS_

字符串资源(String)

IDS_COPYRIGHT

1to0x7FFF

IDC_

对话框内的控制资源(Control)

IDC_RECALC

8to0xDFFF

 

4禁止直接使用数值

在程序中直接使用数值的编程方法,绝对禁止使用。

尽量使用宏定义或参数设定文件,其原因如下:

●在将来变更的时候,需要修改源文件,或者比较导致修改比较复杂,而容易产生漏改等错误。

●光从数值上来看的话,不容易明白其含义。

对这种定数命名时,必须采用望其名通其意的名称来宏定义。

在程序中使用该宏定义。

例:

#defineMAX_BUFFER_LEN256

#defineESCAPE_KEY033

#defineBACKSPACE_KEY010

#defineINSERT_MODE1

#defineAPPEND_MODE2

#definePI3.1415926

 

第2章注释

无论函数也好,数据构造也好,必须相应的注释。

注释的目的,是为了将来软件维护的时候,即使不看源程序,只看注释的内容,也能够充分理解。

注释主要记述以下几个方面的问题:

机能,设计说明,限制事项,边界条件,假定或潜在的问题。

注释不是程序语句的改头换面,而是从更高的一个层次来阐述说明。

注释在下述场所必须追加。

1)所有文件的开头

2)所有函数的开头

3)主要数据结构定义的开头

4)函数内部的变量,和参数的定义处

5)各个函数中关键处理块的开头

1各个文件中的注释

各个文件的开头,下述著作权表示的注释要写。

接着著作权表示的后面,是对这个文件的说明。

/********************************************************************

*版权所有,北京XXX技术开发有限责任公司,1997-2000

*NAME

该文件的文件名,不是全路径名,而是文件短名(即不包含目录)。

*DESCRIPTION

包含复数个函数的时候,要记述为什么要把这些函数整理汇集成一个文件的理由。

*PROJECT

项目的名称

*OS

该项目的所适用的操作系统等软件环境

*DATE

项目的开发日期(本文件作成日期)

*Notes

其他的一些注释说明。

********************************************************************/

2各个函数的注释

各个函数的开头,必须追加对这个函数的说明。

函数说明的格式虽然根据使用的语言而有所不同,但是要包含下述的情况。

特别是注明了“必须”的项目是不能缺少的。

*NAME(必须)

函数名

*FUNCTION(必须)

函数的功能,用简单的名词句来描述函数所完成的功能。

*INPUT(必须)

入力用参数说明

*OUTPUT(必须)

输出用参数说明

*UPDATE(必须)

更新的全局变量的清单及说明。

*RETURN(必须)

函数的返回值以及其含义。

*CALLINGROUTINED

调用该函数的函数清单。

*ROUTINESCALLED

本函数调用函数的清单。

*NOTES

本函数利用的前提条件。

例如:

需要调用初期化函数。

*HISTORY(必须)

变更或版本更新的时候,日期,版本号,变更者名,变更内容。

3数据类型的注释

对于头文件中一些主要的数据结构定义,要说明它是什么样用途的定义,以及如何被使用的。

改变的履历也应该标明。

例:

typedefstruct_JOB_NODE{

intpid;/*ProcessID*/

charjobid[JIDLEN];/*JobID*/

charjobname[JNAMELEN];/*JobName*/

charexecpath[EXECPATHLEN];/*Execpath*/

charexecpara[EXECPARALEN]/*Execparameter*/

characcess[ACCESSIEN];/*Accessmode*/

charkillsig[SIGNALLEN];/*Processkillsignal*/

charstopsig[SIGNALLEN];/*Processstopsignal*/

charusrsig[SIGNALLEN];/*Userdefinesignal*/

}JOB_NODE;

4变量及参数的注释

对于变量及函数的参数,要说明其使用的目的。

5关键处理块的注释

对于关键处理块的说明,要从详细的设计层次来阐述。

而不是简单的程序语言的改头换面,那样只能使注释单调烦琐。

 

第3章原代码的变更

对软件源代码进行修改的时候,修改部分及其原因,为了让别人能够明白,必须加以一定的注释。

而这种做法的目的有以下的重要意义。

1)错误问题发生的时候,可以帮助快速定位问题的发生点。

2)对于软件的版本更新管理有重要的意义。

1表示变更的注释

对于变更的场所,必须追加满足下述条件的注释。

1)注释要覆盖变更部分的整体范围。

因此,对于每个变更部分的开始和结束,都要追加以下的注释。

/*AddorDeletebeISE/Zhang97.02.19forxxxxxxxxxxxxxxx*/

………………

/*AddorDeleteEnd*/

此种注释,最好对于比较大程度范围的变更比较有效。

在有很多细小的变更的场合,每一行程序都以此种方式进行注释,将使得可视性受到影响。

可以采用以下注释方式。

/*ModifiedbyISE/Zhang97.02.19gnStatus=STAT_ERROR*/

gnStatus=STAT_OK

或者

/*ModifiedbyISE/Zhang97.02.19forbuglackof&*/

sockfd=socket_open_server(AF_INET,SOCK_DGRAM,&iruexec_addr_in,len);

/*sockfd=socket_open_server(AF_INET,SPCK_DGRAM,&iruexec_addr_in,len);*/

当一个函数的大部分发生变更时,可以把该函数拷贝一份,再作变更。

2)变更的时间以及版本号要记录。

在版本发行以前如果作变更,不需要加入版本号。

3)变更部分的注释格式要统一。

这样可以使用编辑工具或者检索工具,把所有的变更没有遗漏地检出。

所以使用一定的关键词是有必要的。

4)变更的场所,要一目了然。

要求注释的格式是醒目并且整齐。

2变更方法

由于变更后经常要参照变更前的源程序,考虑到这种情况,可从下述的三种变更方法中选择一个最合适的,在项目中判断。

1)源程序必须留下。

●利用条件编译。

利用条件编译能清楚的看见变更前后的源程序,且可以简单的进行变更前后的切换。

/*ModifiedbyISE/Zhang1997.02.19forxxxxxxxxxxx*/

#ifndefUNIX_BSD

xxxxxxxxxxxxxxxxxxxxx;

xxxxxxxxxxxxxxxxxxxxx;

xxxxxxxxxxxxxxxxxxxxx;

#elseUNIX_SUSV

xxxxxxxxxxxxxxxxxxxxx;

xxxxxxxxxxxxxxxxxxxxx;

xxxxxxxxxxxxxxxxxxxxx;

#endif

●把源程序给注释掉。

保留变更前的源程序,并注释掉。

在后面追加变更后的源程序。

/*————*/

/*——_*/

/*ret=AddRecvCallBack(JMS_MID_FILE_REQUEST,JMS_JB_FileRet,NULL,0);*/

/*if(ret<0){*/

/*JMS_OutMsg(IRUEXEC,”main”,

“JMS_MID_FILE_REQUEST受信处理

登录失败”);*/

/*JMS_JB_Exit

(1);*/

/*}*/

ret=AddRecvCallBack

(JMS_MID_FILE_PEQUEST,JMS_JS_FileRet,

ptrSASCASONETIME)

if(ret!

=JMS_OK)

JMS_OutMsg

(IRUEXEC,”main”,”JMS_MID_FILE_REQUEST

受信处理登录失败”);JMS_JB_Exit

(1);

}

2)利用版本管理

对于需要变更的源程序,直接给予变更。

然后利用版本管理工具来管理各个阶段版本的源程序。

或者只是简单地把原有的程序拷贝到另一个目录中,在必要的时候,在进行文本文件的对比,以明确其差异。

但也存在一个问题,即不容易知道是否是新还是旧版本。

 

第4章样例参考程序

1请参考MFC源代码程序库

特别注意:

本文中的样例代码若有与MFC源代码程序不一致,则以MFC源代码程序为标准。

2付.h文件的范例

/***************************************************************

*NAME:

jruexec.h

*FUNCTION:

*PROGRAMMED:

SJCS/JMS

*DATE(ORG):

93.12.3

*PROJECT:

JMS

*OS:

UNIX:

SYSTEMV

*HISTORY:

*ID—DATE————NOTE————————————————————

*0093.12.3SJCS/JMS初期作成

****************************************************************/

#ifndefJMSJB_H_

#defineJMSJB_H_

/***************************************************************

*INCLUDEFILE

***************************************************************/

#include“irujs.h”

#include”irujsmsg.m”

#include”irujssys.m”

/***************************************************************

*MACRODEFINE

************************************************************

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

当前位置:首页 > 考试认证 > 财会金融考试

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

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