技术管理部编程规范CC++Word文档下载推荐.docx

上传人:b****8 文档编号:22882544 上传时间:2023-02-05 格式:DOCX 页数:19 大小:24.40KB
下载 相关 举报
技术管理部编程规范CC++Word文档下载推荐.docx_第1页
第1页 / 共19页
技术管理部编程规范CC++Word文档下载推荐.docx_第2页
第2页 / 共19页
技术管理部编程规范CC++Word文档下载推荐.docx_第3页
第3页 / 共19页
技术管理部编程规范CC++Word文档下载推荐.docx_第4页
第4页 / 共19页
技术管理部编程规范CC++Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

技术管理部编程规范CC++Word文档下载推荐.docx

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

技术管理部编程规范CC++Word文档下载推荐.docx

大型软件项目通常由相应的大型开发团队承担。

大型团队生成的代码要有项目范围内可评测的质量,代码必须遵从于某一标准并以此来评价。

因此,对于中国现代化支付系统项目的开发,需要制定一套编程规范。

1.2目的

本文表述C/C++编程的规则,用来作为编程的标准,使达到以下目的:

●增加开发过程代码的强壮性、可读性、易维护性;

减少有经验和无经验开发人员编程所需的脑力工作。

●在项目范围内统一代码风格。

●通过人为以及自动的方式对最终软件应用质量标准。

●使新的开发人员快速适应项目氛围。

●支持项目资源的复用:

允许开发人员从一个项目区域(或子项目团队)移动到另一个,而不需要重新适应新的子项目团队的氛围。

1.3内容说明

本文将描述C/C++编程规范,并对C/C++结合数据库、CICS和MQ开发时需注意的问题进行说明。

2.C/C++编程规范

2.1代码组织与风格

(1)、可读性第一,效率第二。

(2)、程序首先是正确,其次是优美。

(3)、程序结构清析,简单易懂。

(4)、循环、分支层次不要超过五层。

(5)、使用括号以避免二义性。

(6)、对嵌套语句使用小的、一致的缩进风格。

缩进量一致并以Tab键为单位,定义Tab为4个字节。

(7)、不同文件中放置模块规约与实现。

C++程序头文件扩展名为“.hpp”,实施文件扩展名为“.cpp”;

C程序头文件扩展名为“.h”,实施文件扩展名为“.c”。

(8)、每个模块规约避免定义多个类。

(9)、避免将私有实施声明置于模块的规约中。

(10)、防止重复文件包含的保护

#ifndefmodule_name//使用预处理符

#definemodule_name//防止重复

//模块定义

……………

#endif//module_name.hpp结束

2.2命名

(1)、不要声明以一个或多个下划线('

_'

)开头的名称。

(2)、避免使用只靠字母大小写才能区分的名称。

(3)、选择清晰的、易辨认的、有意义的名称。

(4)、类的名称使用名词或名词短语。

(5)、过程类型的函数名称使用动词。

(6)、异常名选用否定的含义。

如使用以下词的一个bad、incomplete、invalid、wrong、missing或illegal作为名称的一部分,而不要机械的套用error或exception,因为它们并不表达具体的信息。

(7)、变量,函数等的命名规则可参照附录的命名约定。

2.3注释

(1)、注释原则上要求使用中文。

注释与源代码尽可能靠拢。

注释可以与语句在同一行,也可以在上行。

(2)、一目了然的语句不加注释。

(3)、C++程序应使用C++风格注释分界符"

//"

,而非C风格的"

/*...*/"

(4)、每个源程序文件,都有文件头说明。

(5)、每个函数,都有函数头说明。

(6)、注释的作用范围可以为:

定义、引用、条件分支以及一段代码。

(7)、主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。

(8)、常量定义有相应说明。

(9)、处理过程的每个阶段都有相关注释说明。

(10)、在典型算法前都有注释。

2.4声明

(1)、不要随意定义全局变量,尽量使用局部变量。

(2)、所有变量在调用前必须被初始化。

(3)、尽量使用class而不是struct来实现抽象数据类型。

(4)、避免在类声明中定义函数。

(5)、函数要尽量只有一个返回点。

2.5表达式和语句

(1)、当从布尔表达式分支时使用if语句。

当从离散值分支时使用switch语句。

当分支条件为离散值时使用switch语句而不使用一系列的“elseif”。

(2)、一定为switch语句提供一个default分支以记录错误。

(3)、当循环需要迭代前测试时使用for语句或while语句。

(4)、当循环需要迭代后测试时使用dowhile语句。

(5)、循环中避免使用jump语句。

避免使用除循环结束条件以外的循环退出方式(使用break、return或goto)。

(6)、禁止GOTO语句。

(7)、避免不必要的分支。

2.6复用

(1)、尽量使用标准库函数和公共函数。

(2)、重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。

(3)、公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。

(4)、公共控件或类应建立使用模板。

(5)、谨慎使用多继承。

因为多继承带来了许多额外的复杂性。

2.7特殊限制

(1)、已删除的对象指针要赋予空指针值。

设置已删除对象的指针为空指针可避免灾难的发生:

重复删除非空指针是有害的,但重复删除空指针是无害的。

即使在函数返回前,删除操作后也总要赋一个空指针,因为以后可能添加新的代码。

(2)、C和C++内存操作要避免混合使用。

C库函数malloc、calloc和realloc不应用于分配对象空间:

此时应使用C++操作符new。

只有在内存传递给C库函数处理时,才使用C函数分配内存。

不要使用delete来释放由C函数分配的内存。

(3)、删除由new创建的数组对象时使用delete[]。

使用delete删除数组对象时如果不使用空方括号(“[]”),则只删除数组的第一个元素,因此导致内存泄漏。

(4)、对所有的用户输入,必须进行合法性检查。

(5)、不要比较浮点数的相等,如:

10.0*0.1==1.0,不可靠。

(6)、程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等。

2.8程序的结构

(1)、程序以说明性段落开始,用于记载程序所属的应用系统、程序名、作者、完成时间、版本号、主要功能描述、历次修改记录等内容,具体见附件1中的注释部分。

(2)、在MAIN的主体部分要清晰明了地反映程序的结构。

(3)、每个函数要以一段函数的说明开始,具体见附件1中的注释部分。

(4)、当错误或例外条件发生时,都要交由统一的错误处理函数进行处理,整个程序尽量允许一个正常出口,一个或两个非正常出口。

3.数据库编程规范

3.1复用

这里所描述的规范仅针对C/C++中嵌入SQL编程。

数据库C/C++嵌入SQL编程与UNIXC/C++编程规范基本相符。

3.2注意事项

●每次完成EXECSQL…语句都应检查语句执行是否成功。

●不要使用select*

●不要使用结构型的宿主变量。

●对于SQL语句的书写格式要求一个子句占一行,且注意对齐,如:

EXECSQLSELECTBANKNO,

ACTNAME

INTO:

szBankno,

:

szActname

FROMACCTTABLE

WHEREACTNO=‘00001’;

If(SQLCODE!

=0)

{

…..

}

4.CICS编程规范

4.1说明

●本章对使用C++语言在CICS平台的开发做出相应编码规范。

对于命名、注释、程序风格等同C/C++编程规范。

4.2注意事项

●CICSClient端使用C++类,包含的头文件为CICSECI.HPP(用于ECI类)或者CICSEPI.HPP(用于EPI类)。

●每个CICS程序都要处理自己的ABEND情况,即在MAIN的开始使用语句HANDLEABEND来捕获ABEND.

●每次调用CICS命令后,都应检查其RESPONDCODE,然后根据RESPONDCODE决定程序的走向,如果一旦发生错误,一定要调用统一的错误处理函数来进行处理。

●对于CICS命令的书写格式要求一个子句占一行,且注意对齐,如:

EXECCICSLINKPROGRAM(MYPROG)

SYSID(MAIN)

RESP(iResp);

●CICS会保留一些进程状态,在交易结束时要注意关闭。

包括:

●打开的文件

●TCP/IPsocket

●环境变量

●共享内存

●动态分配内存

●在头文件里,不要在内联函数定义中使用CICS语句。

●不要在静态对象的构造函数和析构函数里使用CICS语句。

静态的构造函数和析构函数是在一个CICSLUW之外调用的,因而在这些地方用CICS语句会引起异常。

●用C++编写CICS程序,必须使用能够link线程安全库的编译器。

建议使用cicstcl来编译。

●非CICS安全的函数以及一些限制:

函数或服务

限制

Anyfunctionthatisnotthreadsafe

Donotuse.

exec(withoutfork)

setlocale

Sharedmemoryfunctions

DonotattachmemoryattheaddressspecifiedwiththeRegionDefinitions(RD)RegionPoolBaseattribute.CICSusesthisaddressforregionpoolsharedmemory.

CICSinternalfunctions

exitor_exit

fork

RefertotheDCEapplicationprogramminginformation.

stdin,stdout,stderr

Donotusethesestreams.

kill

DonotsendsignalstoanyCICSprocess.

raise

assert

abort

sigprocmask

signals

cincoutcerr

Donotusetheseiostreamobjects.

DCEasynchronouscancellation

DCEthreads

YoucancreatethreadsbutyoumustnotuseanyCICSfacilityinthem.

EncinaTRAN

EncinaTransactionalC

EncinathreadTid

catch(...)(inC++programs)

Anyexceptionsnotgeneratedbytheapplicationmustberethrown(usingthrowwithnoargument).

●用CICS语句代替某些C函数:

●用EXECCICSLINK,EXECCICSXCTL,EXECCICSSTART替代fork(),execl(),system()等。

●用EXECCICSRETURN替代exit()。

●用EXECCICSGETMAIN替代malloc();

用EXECCICSFREEMAIN替代free()。

●用EXECCICSSETTASKPURGETYPE(PURGEFORCEPURGE)替代kill()。

5.MQ编程规范

5.1说明

●本章对使用C++语言在MQ平台的开发做出相应编码规范。

对于命名、注释、程序风格等规范同C/C++编程规范。

5.2注意事项

●每次调用MQI命令后,都应检查其结果,然后根据结果决定程序的走向,如果一旦发生错误,一定要调用统一的错误处理函数来进行处理。

6.编译环境

6.1UNIX下C/C++程序的编译

●对于C程序,使用cc或xlc命令编译。

●对于C++程序,使用CC或xlC命令编译。

●对于CICS程序,使用cicstran命令预编译。

●对于DB2嵌SQL程序,使用db2prep命令预编译。

●对于Oracle嵌SQL程序,使用proc命令预编译。

●编译顺序为:

先预进行CICS预编译,再进行数据库预编译,然后进行C/C++编译和链接。

●应当为程序的编译编写makefile文件。

6.2Makefile的编写

#------------------------------------------------------------------

#说明:

Testmakefile

#

#日期:

2005-05-23

#

#版本:

v1.0

#Copyright(c)2005YLINK

#-------------------------------------------------------------------

#ORACLE

ORA_HOME=/home/oracle

ORA_OPTS=code=cppmode=ansiparse=no

ORA_PROC=/home/oracle/bin/proc

ORA_INC=include=$(CNAPS_HOME)/common/common/include\

include=$(CNAPS_HOME)/common/utils/include\

include=$(CNAPS_HOME)/beps/ccpc/include

ORA_LIB=-L$(ORA_HOME)/lib-lclntsh-lC_r

#CICS

CICS_HOME=/usr/lpp/cics

CICS_OPTS=-p100-nmain-bI:

$(CICS_HOME)/lib/cicsprCpp.exp

CICS_PROC=$(CICS_HOME)/bin/cicstran-lIBMCPP

CICS_INC=-I$(CICS_HOME)/include

#IBMMQ

MQ_LIB=-lmqm_r

#SYBASE

SYBASE_HOME=/sybase

SYBASE_INC=-I$(SYBASE_HOME)/include

SYBASE_LIB=$(SYBASE_HOME)/lib/libsybdb.a-lnsl-lsocket

#COMMONLIB

COMM_HOME=$(HOME)/CommLib

COMM_OPTS=-DCNAPS_PATH_ENV_NAME='

"

BEPSHOME"

'

COMM_INC=-I$(COMM_HOME)/lib/include-Iinclude

COMM_LIB=-L$(COMM_HOME)/lib-lCnapsSvr-lCommon

COMM_OBJS=

#CNAPS

#CompilerandLinker

CC=xlC_r4

CCS=/usr/ibmcxx/bin/makeC++SharedLib

#PUBLICruleforbuildallfile

.SUFFIXES:

.pc.cpp.ccs.C.o.ibmcpp.so

.ccs.pc:

$(CICS_PROC)$<

mv$*.C$*.pc

.pc.C:

$(ORA_PROC)$(ORA_OPTS)$(ORA_INC)iname=$<

oname=$@

.C.o:

$(CC)$(COMM_OPTS)$(COMM_INC)$(CICS_INC)$(SYBASE_INC)-c$<

.cpp.o:

.o.ibmcpp:

$(CCS)$(CICS_OPTS)-o$@$(COMM_LIB)$(ORA_LIB)$(MQ_LIB)$<

.o.so:

$(CC)-KPIC-G-o$@$<

all:

BCSVTEST

clean:

-rm*.o

-rm*.a

-rm*.C

#BCSVTEST

BCSVTEST:

BCSVTEST.obc_public.obc_cmt301.o

$(CCS)$(CICS_OPTS)-o$@.ibmcpp$(COMM_LIB)$(ORA_LIB)$(MQ_LIB)\

BCSVTEST.obc_public.obc_cmt301.o

build:

TagBuilder.o

$(CC)-o$@$(COMM_LIB)$(ORA_LIB)$(MQ_LIB)\

TagBuilder.o

格式模板

1.命名的约定

命名规则主要采用匈牙利命名法。

命名必须具有一定的实际意义。

(1)、变量命名

形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意义字符串,如果连续意义字符串仅两个,可都大写.如OK。

用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。

------------------------------------------------------------------------------ 

前缀 

类型 

例子 

 

Boolean 

bIsParent 

by 

字节 

byFlag 

ch 

char 

chText 

类对象 

cMain(对象实例) 

Double 

dAmount 

fn 

Function 

fnCallback 

Handle(句柄) 

hWnd 

int 

iCount

无符号整型 

nErrCode 

指针 

pMsg

sz,str 

字符串 

szName

WORD 

wCode

x,y 

坐标 

xPos, 

yPos 

其它前缀:

m_ 

类成员变量 

m_nVal, 

m_bFlag 

g_ 

全局变量 

g_nMsg, 

g_bFlag 

局部变量中可采用如下几个通用变量:

nTemp,nResult,I,J(一般用于循环变量)。

(2)、常量命名和宏定义

常量和宏定义必须具有一定的实际意义;

常量和宏定义在#include和函数定义之间;

常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说明其作用。

示例:

#defineMAX_LENGTH500//最大长度

(3)、函数命名

函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源:

模块名及文件名,如是内部函数,只要注释其定义文件名;

第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔。

void 

UpdateDB_Tfgd(TRACK_NAME);

//Module 

Name:

r01/sdw.c

PrintTrackData 

(TRACK_NAME);

r04/tern.c

ImportantPoint(void);

ShowChar(int,int,chtype);

//Local 

Module

ScrollUp_V 

(int,int);

(4)、结构体命名

结构体类型命名必须全部用大写字母;

结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。

typedefstruct

char 

szProductName[20];

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

当前位置:首页 > 高中教育 > 高中教育

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

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