技术管理部编程规范CC++.docx

上传人:b****1 文档编号:2806237 上传时间:2023-05-04 格式:DOCX 页数:19 大小:24.40KB
下载 相关 举报
技术管理部编程规范CC++.docx_第1页
第1页 / 共19页
技术管理部编程规范CC++.docx_第2页
第2页 / 共19页
技术管理部编程规范CC++.docx_第3页
第3页 / 共19页
技术管理部编程规范CC++.docx_第4页
第4页 / 共19页
技术管理部编程规范CC++.docx_第5页
第5页 / 共19页
技术管理部编程规范CC++.docx_第6页
第6页 / 共19页
技术管理部编程规范CC++.docx_第7页
第7页 / 共19页
技术管理部编程规范CC++.docx_第8页
第8页 / 共19页
技术管理部编程规范CC++.docx_第9页
第9页 / 共19页
技术管理部编程规范CC++.docx_第10页
第10页 / 共19页
技术管理部编程规范CC++.docx_第11页
第11页 / 共19页
技术管理部编程规范CC++.docx_第12页
第12页 / 共19页
技术管理部编程规范CC++.docx_第13页
第13页 / 共19页
技术管理部编程规范CC++.docx_第14页
第14页 / 共19页
技术管理部编程规范CC++.docx_第15页
第15页 / 共19页
技术管理部编程规范CC++.docx_第16页
第16页 / 共19页
技术管理部编程规范CC++.docx_第17页
第17页 / 共19页
技术管理部编程规范CC++.docx_第18页
第18页 / 共19页
技术管理部编程规范CC++.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

技术管理部编程规范CC++.docx

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

技术管理部编程规范CC++.docx

技术管理部编程规范CC++

内部资料

注意保密

 

C/C++编程规范

 

 

深圳市雁联计算系统有限公司

2011年3月

目录

1.规范说明1

1.1背景说明1

1.2目的1

1.3内容说明1

2.C/C++编程规范2

2.1代码组织与风格2

2.2命名2

2.3注释3

2.4声明3

2.5表达式和语句3

2.6复用4

2.7特殊限制4

2.8程序的结构4

3.数据库编程规范6

3.1复用6

3.2注意事项6

4.CICS编程规范7

4.1说明7

4.2注意事项7

5.MQ编程规范9

5.1说明9

5.2注意事项9

6.编译环境10

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

6.2Makefile的编写10

附录:

格式模板13

1.命名的约定13

2.注释15

3.编程风格16

1.规范说明

1.1背景说明

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

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

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

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)

Donotuse.

setlocale

Donotuse.

Sharedmemoryfunctions

DonotattachmemoryattheaddressspecifiedwiththeRegionDefinitions(RD)RegionPoolBaseattribute.CICSusesthisaddressforregionpoolsharedmemory.

CICSinternalfunctions

Donotuse.

exitor_exit

Donotuse.

fork

RefertotheDCEapplicationprogramminginformation.

stdin,stdout,stderr

Donotusethesestreams.

kill

DonotsendsignalstoanyCICSprocess.

raise

Donotuse.

assert

Donotuse.

abort

Donotuse.

sigprocmask

Donotuse.

signals

Donotuse.

cincoutcerr

Donotusetheseiostreamobjects.

DCEasynchronouscancellation

Donotuse.

DCEthreads

YoucancreatethreadsbutyoumustnotuseanyCICSfacilityinthem.

EncinaTRAN

Donotuse.

EncinaTransactionalC

Donotuse.

EncinathreadTid

Donotuse.

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=$

.C.o:

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

.cpp.o:

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

.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

void PrintTrackData  (TRACK_NAME);  //Module Name:

r04/tern.c

void ImportantPoint(void);           //Module Name:

r01/sdw.c

void ShowChar(int,int,chtype);    //Local Module

void ScrollUp_V (int,int);           //Local Module

(4)、结构体命名

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

 

示例:

 typedefstruct

{

    char                     szProductName[20];

    char          

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

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2