版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++第第2/37 附录 附录 第PAGE第10/37【原则【原则【原则《重构——改进现有代码的设计》一书中说到重复是代码中最大的坏味道,会带来维护上的困难。编写代码应1-4】尽量减少同样的错误🎧2-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{}之内的2-2】声明类的时候,public、protected、private关键字与分界符{}对齐,这些部分的内容要进行缩2-3】if、else、elseif、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。Copyright(c)2003-2012ZTESoftTechnologyAllrights说明:说明:Public,protected,private按照顺序编写,先函数后成员变量。先描述函数对外接口,构【规则说明:为了避免此文件被重复包含,而引起编译错误。说明:为了避免此文件被重复包含,而引起编译错误。C++是不允许一个类被多次定义,即使2-8】包含标准库头文件用尖括号,包含非标准库头文件用双引号【规则说明:说明://Ur:98723可以加一些简单的描述【规则 class enum /// /// ///枚举,标志黄色 ///变量的说明2-11】宏、常量名必须使用大写字母,用下划线‘_’分割单词。预编译开关的定义使用下划线‘_’开2-12+“名词”或者“形容词+名词”,2-13 : : : : :unsignedchar或BYTE :long :long : :pointerto : : :unsignedshort或WORDdw:DWORD或unsignedlong :数组,arrayofTYPE:字符串:结构类型:对象:struct: :全局变量:字符串:结构类型:对象:struct: :全局变量 全局变量:longlong说明说明:对于protected,private变量加m_前缀是为了在类成员函数中同临时函数变量和参数传this->iSubsId们不建议将类的成员变量声明为iSubsId变量说明boolm_bFlag变量说明【规则voidintcount,Count,COUNT;charsName[16],sNAme[32];voidinta=ifif(a>printf(“a>printf(“a<=设置缩进:工具>选项>文本编辑器>C/C++>制表符>将两个值统一设成4。在UE中,可以通过:高级>配置>编辑器>自动换行/【规则2-17】对于一个类的声明为public,protected函数,请附加详细的说明,包括函数的功能,参数,返see、note、verbatim的关键字视实际情况填写。特别的,Python接口函数必须严格遵守此条。人员阅读代码会带来很大的方便。而且可以通过doxgen根据约定注释生成文档。 @parampszFrom @paramnSize @return staticchar*Fun(constchar*pszFrom,char*pszTo,size_t【规则2-18】源文件名遵循单词首字母大写,中间不🎧现下划线,.h与对应的.cpp的名字一样,禁止🎧现【规则2-3GoogleProtocolBuffer协议时,通过协议文件*.proto自动生成源代码方式而不是中间代码GoogleProtocolBufferGoogleProtocolBuffer协议时,源代码中不应保留*.pb.cc/h的中间文件,只需要保留*.proto文件,编译时自动生成*.pb.cc/h。避免🎧现协议变更而中间代码未同步导致的人为错file(GLOBPROTO_INPUTforeach(PROTO_FILE${PROTO_INPUT})get_filename_component(PROTO_NAME${PROTO_FILE}NAME_WE)OUTPUTDEPENDS${PROTOC}${PROTO_FILE}WORKING_DIRECTORY${CMAKE_CURRENT_BINARY_DIR}跨平台,可以生成native编译配置文件。在linux/unix平台可以生成makefile,在mac平台可以生成xcode,在windows平台可以生成msvc工程的配置文件。 【规则件下,否则不建议使用static变量。说明:说明:voidFun(constTBaseObject*象,则宜改用“const&”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。说明:对于系统内置的类型,包括说明:对于系统内置的类型,包括intlongdouble,floatcharbool等,如果输入参数以值传递);//);//【规则compNoteCPPCHECK已经支持fopen/fread/fseek/fwrite/rename/readdir/system检测,本次补充警或cppcheck检查。警或cppcheck检查。【规则ifif //flagif //flagif(value==0)if(value!=if((x>=-EPSINON)&&//其中EPSINON是允许的误差(即精度现场资费为3700/60,用户账本余额-2035,刚好够使 用量33s,算费结果也是扣2035,但是由于C++浮点 数的误差,在系统中保存的可能是2035.0000000...1 度。最终对ceil的操作,代码修改为:ifp p与NULL显式比较,强调pif(p!=if(c //强调cif(c!=iNewFee=elseif(dOldFee>=0)iNewFee=iNewFee=(-1)*ifiAdjustMethodCEIL//if(dOldFee>=0)iNewFee=ceil(dOldFee);elseiNewFee=(-1)*ceil(ABS(dOldFee));【规则3-12】在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。避免使用"1.const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对2.2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。如:constdoublePI=3.1415926;//PI值doubledNumber //doubledNumber //3-14gotogotogoto语句,会使程序结构难于理解,在gotogoto表达的语义,可以使用其他方式(顺序、【规则978824doubleint类型的值,导致溢🎧为负值。可以考虑在AIX主机加-qinfo=trd重新编译,会产生如下提示进行修改。"a.c",line5.3:1506-452(I)Assigningafloating-pointtypetoanintegraltypemayresultcast.cpp:10:warning:conversionto‘int’from‘double’mayalterits SPR在编程中具体应用。对于变量而言,每个变量只有一个用途。对于函数而言,每足SPR的函数实现业务逻辑,并遵循单一抽象层次原则。UR:1089991【规则3-17】单纯的全局变量应该定义在实现文件(CPP/C)中,在头文件中申明,从而避免因为多次包含3-18】函数(Python接口函数)CleanCode说明:例如说明:例如gtest为了方便使用通过EXPECT_TRUE/EXPECT_FALSE,用名字表达含义而不3"1.因为业务调用参数错位时导致bool向long转换,而从低精度向高精度转换,编译器不会报2.另外函数参数较多达到5个,开发人员肉眼未核对🎧来,所以自测也未覆盖到这种场景。"3-19反例:反例:constchar*TimeToString(time_ttTime)使用静态数组返回时间串。日志中利用该函数同3-20】避免对const3-21charAIXunsignedcharlinuxsigned问题:问题:AIX是大端序,Linux是小端序;char在AIX系统中默认是unsignedchar,而在Linux中默认是有符号的。AIX下char默认是无符号类型 char的,存储范围是0-255,Linux下是signed char范围是-127-127,导致了数据保存的差异,产生负值。lTmplTmp8|1charunsignedcharsignedchartmpValue[1024]={0}; 要改为unsignedchartmpValue[10240【建议【建议【建议3-4】优先使用C++中的4种不同的类型转换,包括static_castdynamic_castconst_cast,说明:说明:C++core的virtualvoidclassclassB:publicboolclassC:publicboolA*a=newB();A*a=newB*b=//这个时候,如果a的值为classC,那么任对classB中的操作将导致程序发生 b->m_bBFlag= //B*if((b=dynamic_cast<B*>a)==//这个时候,如果a的值为classC,将进入这个分支,【建议【建议3-6】在面向对象程序中,memset应该尽量少🎧现,类的数据成员的初始化应该尽量依赖构造函数【规则说明说明:CPPdeletep=for(inti=0;i<n;deletep[i];p[i]=NULL;int*p=new delete[]p;voidint*p=newifdelete[]【规则行非空判断,防止程序core,并根据代码或业务需要,记录相关🎧错日志。TRatableEvent类中的成员指针,很多都不是在类内部分配和维护的,仅仅是则很容易引起程序core。4-6QMDB模块以外的所有代码中禁止向外层抛🎧throw关键字。在调用ORACLE、TT、QMDB等接口时应该在调用的地方及时的对异常进行捕获(try…catch…。voidif可能检查参数, //无法及时对其进行捕获处理。对于复杂的初始化工作应该放到Initialize()函数中去。m_pInsertAocAcm=newOdbcConfig):TRatingCtrlEngineBase(DBConfig,OdbcConfig)boolbReFlag=TRatingCtrlEngineBase::Initialize();m_pInsertAocAcm=new(nothrow)if(NULL==m_pInsertAocAcm)return-return对于C++来说,这种不完整的对象将被视为尚未完成创建动作而不被认可,也意味着其析构函C++不支持异常的异常,上述第二种情况将导致一个致命错误,并使程序中止执行。4-10operatornewoperatordelete在C++标准(ISO/IEC14882:2003)第15.2节中明确规定,在使用new或new[]操作存在一个与使用的operatornew严格匹配的operatordelete,则为这个对象所分配的内存也会如果析构函数可能抛🎧deletetrycatch,若是捕捉到异常,则要再调用operatordelete释放对象本身的内存。CSample*p1=newCSample;deletecatch(constsampleExp&CSample::operatordelete(p1);//释放p1//使用err对象完成后续的错误处理catch来捕获delete异常。【规则(catch(...)iRet= "exception=%s,sql=%s.\n",WHERE//iRet= "exception=%s.\n",WHEREiRet=gpBillLog->Warning(WARNING_FATAL,iRet,WHEREFORMAT exception.\n",WHERE);【规则thrownewdeletee=具体根据throw时参数类型是对象本身还是指针。new🎧的异常对象是堆中构造,需要做相应的delete操作,以正确的释放内存。snprintf,vsnprintf函数,使用上述函数时,禁止自拷贝(源和目的地址相同)。strcpy和sprintf函数不带缓冲区长度,存在内存越界风险,改为更加安全的memccpymemccpy函数则会遇到指定的字符就停止拷贝,并且指定字符也会memccpystrncpy函数时一样在缓冲区末尾snprintflinux下会导致非预期结果,可以4-14】对指定大小的数组(包括堆中分配的和栈中分配的)UR: 正确的使用方式如下, for(inti=0;i<MAX_DMT_PASER_NUM;m_vDiameterParser[i].iPno=-1;m_vDiameterParser[i].pDiameterTrans=NULL;一般地,对于数据库表数值类型主键,流水表定义为number(12),其他配置表为number(9)或number(6)number(9)longlongnumber(9)及以下的,如果对空间占用要求严格,变量可以定义为int类型。【规则4-16】程序实现应尽量避免采用递归的形式。极个别情况一定要用到递归时,实现的算法和代码应经过TA的审核。程序的递归是通过调用栈实现的,当递归的次数过多时,会产生栈溢🎧,导致程序core。递归【规则4-17】保护程序免遭非法输入数据的破坏:需要检查所有来源于外部数据的值和子程序所有输入参2》中提到,防御式编程的主要思想是:子程序应该不被传入错误的数据而被破坏,接受范围内,字符串是不是合乎用途,包括企图令缓冲溢🎧的数据、注入的SQL命令、注入的HTML或XML代码等等。故障单939670,后台程序收到了一个CCR,在解析和拷贝到自定义的结构体中时未做【规则1if/elseelse分支没逻辑也需要把逻辑用注释写上。参考620982。地方也可能使用这个查询方法无意中修改了缓存,导致🎧错,样例参考988161。0内存越界:charpath[256返回GetAttrNULL:GetAttr()->AsInteger()core231int类型,特别是:钱/使用量/ID/IDSession.ExtAttr可能超长,引起截断时,需设置返回码为5031。该字段读取解析的地方,注意完整性校验。否则可能导致core。UR:10906021000以上大字符串,复制使用memccpy代替strncpy,初始化、复位使用首字符设置【规则4-19】创建线程时,需要实际需求确定栈大小,并调用接口指定线程栈大小,避免依赖平台操作系《C++编程规范——101条规则、准则与最佳实践》中第68条:广泛地使用断言记录内部需要注意,不能用断言来检查最终产品肯定会🎧现且必须处理的错误情况。断言是用来处如某模块收到其它模块或链路上的消息后,要对消息的合理性进行检查,此过程为正常的错误【建议GOTGOT方式(简单但存在一些性能问题【建议因为全局变量存放在数据段,每次访问都会有一个从数据段读取的动作,相比而言局部变量有可能在栈中,也有可能在寄存器中,每次都需要先从数据段中读🎧该变量值,处理完成后在要写回数据段,效率相对较低。需要在循环中使用上述变量时,可以考虑先将其赋值给一个局部变量.局部变量5-3122如:如:inta[20][20]可以优化成int5-4】ifelseifelseif(a==//elseif(a==2////5-6forif语句,CPU流水线的清空和转移等低效率事件的发生,可以将if语句提到循环外面来。水线,等待新的跳转目的指令的取指执行,所以可以将if语句提到循环外面来。为5-8mmap,将文件映射到内存,可以提高效率,但是需要注意文件太大会影【建议【建议TSChrTSChrsSessionId<<';'<<pRatableEvent.GetAttrEx(EA::RATING_GROUP)->AsInteger()<<';'<<头文件,这样编译包含此头文件的cpp文件时,会因为依赖减少而缩短了编译时间。5-12】优先调用前置形式的++和--说明:根据说明:根据代替,同时注意后续的字符串拷贝等操作要设置0结束符。符置0的方式,另外strncpy函数当源字符串比目标字符串短的时候,strncpy会用0来填充不足的部分,导致性能下降,而memccpy函数则会遇到指定的字符就停止拷贝,不过在使用memccpy时要在缓冲区末尾增加结束符,避免内存越界访问。+B🎧B附录 CodeReviewCheck规则2-代码走查结合排版工具(astyle)规则2-代码走查结合排版工具(astyle)规则2-代码走查结合排版工具(astyle)规则2-规则2-规则2-规则2-规则2-规则2-规则2-规则2-编译开关规则2-规则2-规则2-规则2-规则2-代码走查结合排版工具(astyle)规则2-规则3-规则3-规则3-static规则3-规则3-规则3-规则3-规则3-规则3-规则3-过程/函数中申请的文件句柄,在退🎧规则3-规则3-规则3-规则3-规则3-编译选项可以查规则3-规则3-规则3-Clean规则3-规则3-const规则3-char规则4-规则4-debug_new规则4-规则4-规则4-规则4-业务代码中是否违规向外层抛🎧规则4-规则4-构造函数是否违规抛🎧规则4-析构函数是否违规抛🎧规则4-operatornewoperator规则4-规则4-规则4-strcpy/sprintf规则4-规则4-long规则4-规则4-规则4-4-附录 usingnamespace(catch(...)(B)classTMemSeq#ifndefQUICK_MEMORY_DATABASE_SEQUANCE_H #define #includeclassTMemSeq#endif// #ifdef #includeclassTMemSeq#endif// #ifndef #includeclassTMemSeq#endif// (B)#include"Helper/mdbConfig.h"#include"unistd.h"#include"Helper/mdbConfig.h"#include<unistd.h>#include<Helper/mdbConfig.h>#include"unistd.h"#include<Helper/mdbConfig.h>#include<unistd.h>(C)Ur:98723以账期结束时间-1sUR:10101m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);UR:10101m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);Ur:98723以账期结束时间-1s (D)#define#define#define#define
(C)debugdebug定义符合我们规范的方式是:#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);(D)(B)
protectedprivate(C)
boolExecuteAcctItemImm(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolexecuteAcctItemImm(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolAcctItemImmExecute(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolacctitemimmexecute(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,(A)intPartnerId=staticbools_bUseShareMem=voidSetPartnerId(intchar*pUserName=intaiPartnerIds[32]=staticints_iEnterTimes= 10.6aiPartnerIdsaiPartnerIds (D) ② (A)intg_iSubsId=10;voidSetSubsId(intintiSubsID=printf(“%d,%d,%d\n”,g_iSubsId,iSubsId, (C) 缩进2个空 缩进4个空 缩进1个(B)
2public,protected成员函数,需要给🎧doxygenbrief、param、return、retval的关键字必须说明。 某些情况下,privatedoxygen风格的注释。(B) (D)charif(iRetFlag==0)iRetFlag=ADD_ERROR("SETT-PROC-0011","Renamefilefailure,%s\n",sTime);14-556iRetFlag (D)staticcharsTime[20]={0};121,2(A)constchar*TRecordData::GetNextPath(char*sDataPath) 1constchar*3return1char*sDataPathconstchar(C)boolconstllongTRateLink2llong3TRateLink3TRateLink (D)boolif((year%4==0)&&((year%100!=0)||(year%400bRet= const,1行改为(constint参数不可做工作变量,4intiYearyear;year(C)(B)(A)这段C++class virtualvoidcout<<"<<Test.TestForCodeRulethis:"<<this<<"vtadr:"<<*(void**)this<< 是,virtualvoidTestForCodeRule()没有使用return;是,virtualvoidTestForCodeRule()是,Tes
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南旅游职业学院《移动机器人导论》2023-2024学年第一学期期末试卷
- 办公技术新动向模板
- 述职报告:智慧农业实践
- 职业导论-房地产经纪人《职业导论》点睛提分卷2
- 心理协会辩论赛策划书
- 二零二五年度家庭养老照护床位服务与环保材料采购协议3篇
- 人教版小学数学(2024)一年级下册第一单元 认识平面图形综合素养测评 B卷(含答案)
- 2024-2025学年吉林省长春五中高三(上)期末数学试卷(含答案)
- 江西省赣州市大余县2024-2025学年七年级上学期1月期末生物学试题(含答案)
- 二零二五年酒店客房入住体验提升合作协议2篇
- 光伏电站环境保护施工方案
- 上海南洋模范2025届高二生物第一学期期末检测模拟试题含解析
- 网络与信息安全管理责任制度
- 2024-2025学年五年级科学上册第二单元《地球表面的变化》测试卷(教科版)
- 小区物业服务投标方案(技术标)
- 2025届高考数学一轮复习建议-函数与导数专题讲座课件
- 心电图基本知识
- 中煤电力有限公司招聘笔试题库2024
- 消防接警员应知应会考试题库大全-上(单选、多选题)
- 2024风电场在役叶片维修全过程质量控制技术要求
- 湖南省岳阳市岳阳楼区2023-2024学年七年级下学期期末数学试题(解析版)
评论
0/150
提交评论