技术管理部编程规范CC++Word文档下载推荐.docx
- 文档编号:22882544
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:24.40KB
技术管理部编程规范CC++Word文档下载推荐.docx
《技术管理部编程规范CC++Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《技术管理部编程规范CC++Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
大型软件项目通常由相应的大型开发团队承担。
大型团队生成的代码要有项目范围内可评测的质量,代码必须遵从于某一标准并以此来评价。
因此,对于中国现代化支付系统项目的开发,需要制定一套编程规范。
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。
用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。
------------------------------------------------------------------------------
前缀
类型
例子
b
Boolean
bIsParent
by
字节
byFlag
ch
char
chText
c
类对象
cMain(对象实例)
d
Double
dAmount
fn
Function
fnCallback
h
Handle(句柄)
hWnd
i
int
iCount
n
无符号整型
nErrCode
p
指针
pMsg
sz,str
字符串
szName
w
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];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 技术管理 编程 规范 CC