软件编码规范方案.doc_第1页
软件编码规范方案.doc_第2页
软件编码规范方案.doc_第3页
软件编码规范方案.doc_第4页
软件编码规范方案.doc_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软软软软软软件件件件件件编编编编编编码码码码码码规规规规规规范范范范范范 文件编号 RDC DED SCS SPC 00 当前版本 作 者 审 核 人 文件状态 草稿 正式发布 正在修改 完成日期 中国人民银行清算总中心 支付系统开发中心 文档修订记录 版本编号变化状态简要说明日期变更人批准日期批准人 注 变化状态 A 增加 M 修改 D 删除 目目 录录 第一篇第一篇C C 编码规编码规范范 6 第一章第一章代代码组织码组织 6 第二章第二章命名命名 9 2 1文件命名 9 2 2变量命名 9 2 3常量与宏命名 10 2 4类命名 10 2 5函数命名 10 2 6参数命名 11 第三章第三章注注释释 12 3 1文档化注释 12 3 2语句块注释 17 3 3代码维护注释 20 第四章第四章编码风编码风格格 22 4 1排版风格 22 4 2头文件 26 4 3宏定义 27 4 4变量与常量 30 4 5条件判断 32 4 6空间申请与释放 33 4 7函数编写 33 4 8类的编写 37 4 9异常处理 40 4 10特殊限制 40 第五章第五章编译编译 41 第六章第六章ESQL C 编码编码 46 第二篇第二篇JAVA 编码规编码规范范 47 第一章第一章代代码组织码组织 48 第二章第二章命名命名 51 2 1包命名 51 2 2类命名 51 2 3接口命名 51 2 4方法命名 51 2 5变量命名 51 2 6类变量命名 52 2 7常量命名 52 2 8参数命名 52 第三章第三章注注释释 53 3 1文档化注释 53 3 2语句块注释 57 3 3代码维护注释 59 第四章第四章编码风编码风格格 61 4 1排版风格 61 4 2包与类引用 66 4 3变量与常量 66 4 4类编写 67 4 5方法编写 68 4 6异常处理 71 4 7特殊限制 71 第五章第五章编译编译 73 第六章第六章JSP 编码编码 74 6 1文件命名及存放位置 74 6 2内容组织 74 6 3编码风格 76 6 4注释 78 6 5缩进与对齐 78 6 6表达式 79 6 7JavaScript 79 第三篇第三篇POWERBUILDER 编码规编码规范范 80 第一章第一章代代码组织码组织 81 第二章第二章命名命名 82 2 1文件命名 82 2 2对象命名 82 2 3变量命名 84 2 4常量命名 85 2 5函数与事件命名 85 2 6参数命名 85 第三章第三章注注释释 85 3 1文档化注释 85 3 2语句块注释 88 3 3代码维护注释 88 第四章第四章编码风编码风格格 89 4 1界面风格 89 4 2排版风格 93 4 3变量与常量 95 4 4条件判断 96 4 5空间申请与释放 97 4 6函数编写 97 4 7特殊限制 97 第五章第五章SQL 编码编码 98 前前 言言 程序编码是一种艺术 既灵活又严谨 充满了创造性与奇思妙想 然而应用软件设计是一项 团结协作工程 而非程序员展示个人艺术的舞台 大型应用软件项目更是由很多程序员组成的大 型开发团队协同完成的 每个程序员都有自己的编码经验与风格 如果缺乏统一的编程规范 则 可能导致软件产品最终程序代码风格迥异 可读性与可维护性均较差 不仅给程序代码的理解带 来障碍 也增加维护阶段的工作量 此外 经验证明不规范的编码行为往往还会导致程序出现更 多的隐含错误 为规范编码行为 增强程序代码的可读性 可维护性 提高编码质量与效率 保障应用软件产 品整体品质与可持续开发性 特制定本规范 本规范分 C C 编码规范 Java 编码规范 PB 编码 规范三篇 分别从代码组织 命名 注释 编码风格 编译等方面加以阐述 规范文本分为规则与 建议两种 其中规则是强制执行的条款 建议则由程序员根据实际情况灵活掌握 一一一C C 编码规编码规范范 一一一 代代码组织码组织 规则规则 1 使用不同的文件分别放置模块的约束与实现 C 程序的约束文件使用 hpp 做扩展名 实现文件使用 cpp 做扩展名 C 程序的约束文件使用 h 做扩展名 实现文件使用 c 做扩展名 规则规则 2 一个模块可以包含一个类或功能上紧密联系的多个类 禁止将功能关联松散的多个类 放置到一个模块中 规则规则 3 模块约束应仅包含模块对外提供的功能 禁止将模块内部使用的功能声明在模块约束中 下例中 IsChineseChar 是内部使用的函数 不提供给外部应用使用 因此不能在 commpub hpp 中 增加声明 例 commpub hpp BOOL IsChineseString const char sInStr 例 commpub cpp static BOOL IsChineseChar const char s BOOL IsChineseString const char sInStr for int ii 0 ii strlen sInStr ii if IsChineseChar sInStr ii return FALSE return TRUE 规则规则 4 简单应用应创建下列目录结构 模块程序代码应分别放置到 src include 目录与 src source 目录 编译文件放置到 src source 目录 编译后的可执行文件放置到 rel bin 目录 静态 库或动态库放置到 rel lib 目录 应用使用的外部库及头文件放置在 rel 同级的 lib 与 lib include 目 录 Work Directory src source makefile cpp c include hpp h rel bin lib 规则规则 5 复杂应用应分子系统创建目录结构 模块程序代码应分别放置到 src module include 目录 与 src module source 目录 应用编译文件放置到 src 目录 编译后的可执行文件放置到 rel bin 目 录 静态库或动态库放置到 rel lib 目录 应用使用的外部库及头文件放置在 rel 同级的 lib 与 lib include 目录 规则规则 6 各子系统可以创建独立的编译文件并放置到 src module source 目录 编译后的可执行文 件放置到 rel bin module 目录或 rel bin 静态库或动态库放置到 rel lib module 或 rel lib 目录 此时 应创建一个编译全部子系统的编译文件或脚本放置到 src 目录 Work Directory module1 source makefile cpp c include hpp h rel bin lib module2 source makefile cpp c include hpp h makefile make sh src module1 bin lib module2 bin lib 一一一 命名命名 规则规则 7 命名应遵循下列原则 应简单清晰通俗 应使用英文命名 禁止使用中文命名 应尽量选择通用词汇 应使用完整单词或词组 避免使用简称 应准确表达其含义 避免同时使用易混淆的字母与数字 如 1 与 l 0 与 o 禁止使用只靠大小写区分的多个名称 多单词组成的名称 单词的首字母应大写 如 FileName 规则规则 8 名称太长超过 15 字符时应使用简称 简称应遵循 应使用标准的或常用的简写 如 Temp tmp Length len 应用范围内简写应一致且规范 避免各处简写各不相同 简写可以使用单词的前一个或多个字母 如 Channel Chan Connect Conn 也可以使 用去掉所有的不在词头的元音字母 如 screen scrn primtive prmv 多个单词组成的名称 使用有意义的单词或去掉无用的后缀并简称 如 Count of Failure FailCnt Paging Request PagReq 2 1文件命名文件命名 规则规则 9 文件命名应使用模块名的小写字母形式 禁止使用汉字或大 小写字母混用作为代码文 件名 2 2变变量命名量命名 规则规则 10 变量命名主要采用匈牙利命名法 格式为 作用域范围前缀 前缀 基本类型 名称 其中 作用域范围前缀 前缀以小写字母表示且可选 基本类型以小写字母表示且必选 常用前常用前缀缀符符 前缀符含义例子 g 全局变量g stSystem g cMacType g strSysName s 静态变量s nCurCnt s strStaticName s pSysTime m 类数据成员m nBankType m sWrkBuffer m strMyName h句柄类变量hnFileHandle hnSocket hpProcHandle p指针类变量psReadBuff pstrRetStr ppTarget a数组类变量anPorts asSendBuffers apWrkBuffs 常用基本常用基本类类型符型符 前缀符含义例子 bboolbOK bQuit bFind c chcharcFlag cBankType chSubSystemType schar sSysName sStaticName sTimeStr strCString StringstrSysName strStaticName strTimeStr byunsign char byMacStr bySendBuffer bySrcBuffer n iintnCnt nPort nRetCode llonglFileSize lOffset lCount ddoubledAmount dSumVal dWrkVal ffloatfAmount fSumVal fWrkVal ui ulunsigned int longuiCnt uiFileSize ulRetCount wWORD与 unsigned int 等价的 32 位整数 dwDOUBLE WORD与 unsigned long 等价的 64 位整数 em枚举型变量emDays emColors emSet st结构型编码stSystem stCtrlData stSet 规则规则 11 禁止使用单字母作为变量名 但下列常用单字母变量除外 常用常用单单字母字母变变量量 变量类型说明 i j k m nint循环变量 cchar 单字符变量 schar 字符数组变量 x yint位置变量 pchar 指针变量 2 3常量与宏命名常量与宏命名 规则规则 12 常量与宏应使用全大写名称 多词组名称使用 分隔各单词 并使用断行注释说明其 含义如 const int MAX BUFF SIZE 1024 最大存储区字节数 define MAX FRAME SIZE 512 单帧的最大长度 规则规则 13 作为错误码或返回码的宏 应使用 E 类型 NAME 形式 并使用断行注释说明其含 义 define E FILE NOTFOUND 61101001 文件不存在 define E DB SELECT FAIL 62301050 选取数据库失败 define E SYS INVALID STATUS 62301001 系统状态非法 规则规则 14 作为编译条件的宏 应使用 形式 如 ifdef NONE THROW endif ifndef FOR CCPC endif 规则规则 15 为防止重复包含而定义的头文件预处理宏 应使用 NAME HPP C 或 NAME H C 形式 其中 NAME 为模块名称 如 ifndef CSIGNAL HPP define CSIGNAL HPP endif ifndef CSIGNAL H define CSIGNAL H endif 2 4类类命名命名 规则规则 16 类命名应使用字符 C T 名称形式 其中名称应使用名词或名词短语 且每个单词 首字母大写 如 CSignal CFile CString CTagMgr 2 5函数命名函数命名 规则规则 17 函数命名应使用能够表达函数功能的英文动词或动宾结构短语 且每个单词的首字 母大写 如 GetName StrTrimLeft KillProc 禁止在函数名称中使用非字母或数字的其他字 符 如下划线 建议建议 1 不应在函数名中使用数字 如 GetName1 Kill2 但数字是短语一部分的 可以使用 如 KillSigusr2 2 6参数命名参数命名 建议建议 2 函数或方法的参数命名参考变量命名 但应使用 In Out Ret 等简写修饰参数 增加函 数声明的可读性 如 BOOL IsSpaceStr LPCSTR sInStr ULONG nMaxLen 0 ULONG plRetOffset NULL void HexToBin LPCSTR sInStr BYTE psOutStr ULONG plRetSize NULL 一一一 注注释释 规则规则 18 程序代码中增加注释的目标是帮助对程序的阅读理解 不宜太多或太少 太多则会 对阅读产生干扰 太少则不利于代码理解 因此只在必要的地方才加注释 且准确 易懂 简洁 3 1文档化注文档化注释释 3 1 1文件注文件注释释 规则规则 19 文件注释放置在文件头部 主要包括此文件的功能说明 编写人和修改人以及编写 和修改的日期 版权声明 版本等信息 应尽量使用中文 注释格式如下 file filename hpp brief 文件文件简简要要说说明明 文件文件详细说详细说明明 author 时间时间 作者作者 1 贡贡献献 1 时间 作者 2 贡献 2 时间 作者 3 贡献 3 version 时间时间 版本版本 1 简简要版本要版本说说明明 1 时间 版本 2 简要版本说明 2 par 其他重要信息 其他重要信息说明 warning 警告信息 par 版权信息 版本声明信息版本声明信息 例 file csignal hpp brief UNIX 信号函数封装类 本类封装部分 UNIX 信号处理函数 简化在 UNIX 下编写信号处理程序的编码难度 本类主要提供下列三类方法 信号集合管理 提供信号集合的添加 删除 判断功能 信号句柄管理 提供设置与获取信号处理函数功能 信号处理 设置与获取阻塞信号集 发送信号 等待信号功能 author 2007 03 05 lny 创建初始版本 2007 03 07 lny 添加文档注释信息 version 2007 03 05 V1 0 创建初始版本 2007 03 07 V2 0 添加文档注释信息 warning 本类不能在 WIN32 操作系统使用 par 版权信息 Copyright C 2007 2007 CNCC CDC 注 粗体字为需定制化的内容 兰色字为可选的内容 如果没有这些内容 请删除 下同 3 1 2类类注注释释 规则规则 20 类注释放置在类声明前 主要介绍类的功能及相关说明 注释格式如下 brief 类简类简要要说说明明 类详细说类详细说明明 par 其他重要信息 其他重要信息说明 par 变更历史 时间 作者 修改说明 例 brief UNIX 信号处理函数封装类 本类封装部分 UNIX 信号处理函数 简化在 UNIX 下编写信号处理程序的编码难度 本类主要提供下列三类方法 信号集合管理 提供信号集合的添加 删除 判断功能 信号句柄管理 提供设置与获取信号处理函数功能 信号处理 设置与获取阻塞信号集 发送信号 等待信号功能 warning 本类不能在 WIN32 操作系统使用 class CSignal 3 1 3函数或方法注函数或方法注释释 规则规则 21 函数或方法注释放置在其声明前 主要介绍函数的功能 参数 返回值 异常 使用 说明 范例 引用关系 变更信息等信息 注释格式如下 brief 函数功能函数功能简简要要说说明明 param in out 参数名称 1 参数 1 简要说明 param in out 参数名称 2 参数 2 简要说明 return 返回值说明 返回值 1 返回值 1 说明 返回值 2 返回值 2 说明 exception 异常说明 异常 1 异常 1 说明 异常 2 异常 2 说明 note 函数功能详细说明 详细说明 1 详细说明 2 warning 警告信息 deprecated 函数即将失效警告 see 引用说明 par 使用范例 code 例子程序 endcode par 算法或流程说明 详细算法或流程说明 par 变更历史 时间 作者 修改说明 例 brief 添加一个或多个信号到信号集合 param out stSet 要操作的信号集合 param in nSignal 要添加到集合的信号 param in nOtherSignal 要添加到集合的其他信号 return 添加失败返回负整数 失败原因可以从 errno 获取 note 如果要添加多个信号 则必须使用 0 作为最后一个信号 warning 如果添加多个信号时没有使用 0 作结束 则程序可能异常中止 see DelFromSet AddAllToSet ClearSet par 使用范例 code int nRetCode sig AddToSet if nRetCode 0 Fail nRetCode sig AddToSet if nRetCode 0 Fail endcode int AddToSet sigset t stSet int nSignal int nOtherSignal 0 建议建议 3 重要的或复杂的函数 应提供算法说明或使用范例 如 例 brief 根据行号与密码生成报尾校验码作为身份认证串 param in sBankCode 行号 param in sPassword 密码 return 身份认证串 par 算法介绍 计算 sBankCode sPassword 的 MD5 数字摘要 输出 32 位字符 取 32 位字符的 0 5 10 15 16 21 26 31 位作 16 位字符串的偶数位 取 AUTHBEPS 各位作 16 位字符串的奇数位 加密这 16 位的字符串 得到 32 位的字符串作为认证串 CString BuildAuthStr LPCSTR sBankCode LPCSTR sPassword 3 1 4数据成数据成员员注注释释 规则规则 22 类的每个数据成员均使用断行注释 注释格式如下 例 class CMTMsg private BOOL m bBodyInFile 是文件型报文 CString m strFileName 文件型报文的文件名 CString m strBody 直接设置的报体串 CMTMsgHeader m Header 报头对象 CMTMsgTail m Tail 报尾对象 CMTBatHeader m BatHeader 批量业务头对象 3 1 5结结构注构注释释 规则规则 23 结构可使用简单注释 也可使用与类相同的注释格式 其数据成员使用断行注释 注释格式如下 例 报头结构 总长度 138 字节 struct CMTHeaderMap char blockMark 3 报头块前缀 1 char verID 1 版本号 保留 0 char mesgLen 6 报文总长度 保留 目前为空白 char appTradeCode 8 业务码 0 位 系统号 1 3 位 CMT 号 4 位 节点 5 7 位 保留 char startAddr 12 报文源地址 即报文发起人 char destAddr 12 报文目标地址 即报文接收人 char mesgPurp 1 报文用途 保留 char outForm 1 输出标识 保留 char mesgID MSGID LEN 报文标识号 报文发起人生成 通信层唯一确定一 个报文 char mesgReqNo REQUESTID LEN 报文参考号 报文发起人生成 回应报文带回 进行报文匹配 char workDate 8 报文日期 格式为 YYYYMMDD char sentTime 14 报文时间 格式为 YYYYMMDDHHMISS char expTime 4 报文有效期 保留 0 0 xFFFF 65535 char deliTime 6 报文提交时间 保留 格式为 HHMISS char mesgPRI 1 报文优先级 0 x0 0 xF 15 char reserve 20 保留域 char finalMark 1 报头块后缀 3 1 6宏与宏与变变量注量注释释 规则规则 24 宏与变量使用简单注释或断行注释 特别重要的宏可以使用与类相同的文档注释 注释格式如下 例 define MBT PREFIX 报文块开始标志 define MBT SUFFIX 报文块结束标志 define MBT HEADER 1 报头块开始标志 define MBT BUSINESSHEADER 2 业务头块开始标志 define MBT BUSINESSDATA 3 正文块开始标志 define MBT TAIL C 报尾块开始标志 define MBT FILE F 文件说明块开始标志 define MBT BATHEADER B 批量信息块开始标志 define TAG PREFIX TAG 名开始标志 define TAG SUFFIX TAG 名结束标志 define MSGID LEN 20 报文标识号长度 MSGID define REQUESTID LEN 20 报文参考号长度 REQID 例 业务头保留域长度 define CMTBH RESERVED LEN 16 例 brief 短报文正文体最大长度 此长度应根据 MQCMT 类定义最大消息长度进行调整 超过此长度的报文应分为多个 报文片断传输 par 计算公式 code 最大长度 MQCMT 消息长度 sizeof CMTMsgHeader sizeof CMTMsgTail sizeof MQMsg 1 MQCMT 最大消息长度 175 endcode 目前 MQCMT 类定义的最大消息长度为 1M 1048576 字节 define SHORT MSGBODY MAX LEN 1000000 3 1 7文档注文档注释释技巧技巧 建议建议 4 为使 doxygen 工具能生成更好的文档 编写文档注释时参考下列技巧 注释中使用的标识符前后均应留一个空格 以便 doxygen 识别此标识符 并自动生成一 个引用连接 如 par CMT 报文格式说明 CMT 报文由报头 CMTMsgHeader 可选的批量业务头 CMTBatHeader 正文体 报尾 CMTMsgTail 组成 其中除正文体外 其余各块都是定长的 正文体由一个或多个业务块组成 每个业务块由一个定长的业务头 CMTBusinessHeader 与一个变长正文块 CMTBusinessData 组成 正文块 CMTBusinessData 由一个或多个 TAG 码 TAG 值对 报文域 组成 部分 TAG 值又可由多个定长子域组成 正文体可放置在报文中 也可存储在文件中 而在报文中仅放置文件名 当正文体在文件中 则说明批量业务头 业务头 正文块存储在文件中 注释中可使用 HTML 标记美化最终文档 但别滥用美化标记 较长的文档注释需要分段说明时 使用分段 如果需要段首缩进两字符 使用全角 的空格 文档注释中可以使用 par 增加一个小节 灵活使用此标记可以任意地扩展文档的结构 满足特殊描述的需要 如 par 算法原理 计算机内部运算使用的基数是 2 即满 2 进位 如果计算机字长为 32 位 则最大可 以表示的整数为 4294967296 为了突破计算机最大整数的限制 可以采取两种做法 一是扩大基数 二是增加字长 根据此原理 本类使用 65536 作为基数 每个整数的最大位数 10 unsigned int array 10 因此可以最大整数是 65536 的 10 次方 约 1 4e48 通过变更基数或位数 本类理论 上可以处理的任意整数 需要生成圆点列表时使用 需要生成编号列表时使用 需要特别说明一段文字 可以使用 code endcode 如 par 计算公式 code 最大长度 MQCMT 消息长度 sizeof CMTMsgHeader sizeof CMTMsgTail sizeof MQMsg 1 MQCMT 最大消息长度 175 endcode 为使 doxygen 正确生成函数或方法的连接 注释中的函数名或方法名前后应留一个空格 如该函数或方法没有重载 则不必使用参数列表 如 GetTag 如该函数或方法重载 则 应必须使用参数 类型 列表 如 GetTag LPCSTR AMOUNT return 清除行计数 static int nLineChars 0 输出的行长度计数 if bResetLineChars 行计数复位 nLineChars 0 计算输出长度 int nOutLen 2 4 nInpLen 3 1 考虑到要添加回车换行 多分配点空间 char p strOutStr GetBufferSetLength nOutLen memset p 0 nOutLen 例 逻辑性较强 1 BankCode Password CString strWrkStr sWrkBankCode sWrkPassword 2 计算 MD5 指纹 CString strMD5 md5 HashBuffer BYTE strWrkStr GetBuffer 0 strWrkStr GetLength 3 选取八位数字指纹 char p strMD5 GetBuffer 0 char sTmpStr 17 int ii 0 memset sTmpStr 0 sizeof sTmpStr for ii 0 ii 8 ii sTmpStr 2 ii p 4 ii ii 4 4 组合固定串 p AUTHBEPS for ii 0 ii80 字符 或表达式应分成多行书写 语句应在逗号分隔符处划分新行 表达式应在低优先级操作符处划分新行 操作符放在新行之首 划分出的新行要进行适当的缩进 使排版整齐 语句易读 例 if IsNumberString stCIS410Detail sBankCode strlen stCIS410Detail sBankCode 12 strcmp stCIS410Detail sBankCode stCIS410Detail sOrgBankCode 0 应书写为 If IsNumberString stCIS410Detail sBankCode strlen stCIS410Detail sBankCode 12 strcmp stCIS410Detail sBankCode stCIS410Detail sOrgBankCode 0 THROW OUT E INVALIDLIST StrPrint 票交机构行别非数字或长度非 3 位 s stCIS410Detail sClsCode GetBuffer 0 应书写为 THROW OUT E INVALIDLIST StrPrint 票交机构行别非数字或长度非 3 位 s stCIS410Detail sClsCode GetBuffer 0 建议建议 8 对结构的多个数据成员赋值时 将等号对齐 例 rect top 0 rect left 0 rect right 300 rect bottom 200 应书写为 rect top 0 rect left 0 rect right 300 rect bottom 200 建议建议 9 定义多个宏或初始化多个变量时 将值对齐 例 define MBT PREFIX 报文块开始标志 define MBT SUFFIX 报文块结束标志 define MBT HEADER 1 报头块开始标志 define MBT BUSINESSHEADER 2 业务头块开始标志 define MBT BUSINESSDATA 3 正文块开始标志 define MBT TAIL C 报尾块开始标志 define MBT FILE F 文件说明块开始标志 define MBT BATHEADER B 批量信息块开始标志 define TAG PREFIX TAG 名开始标志 define TAG SUFFIX TAG 名结束标志 应书写为 define MBT PREFIX 报文块开始标志 define MBT SUFFIX 报文块结束标志 define MBT HEADER 1 报头块开始标志 define MBT BUSINESSHEADER 2 业务头块开始标志 define MBT BUSINESSDATA 3 正文块开始标志 define MBT TAIL C 报尾块开始标志 define MBT FILE F 文件说明块开始标志 define MBT BATHEADER B 批量信息块开始标志 define TAG PREFIX TAG 名开始标志 define TAG SUFFIX m chMsgType MQ MT TAIL iSegmentFlag SF LASTSEGMENT strncpy ptr m pBody char pTail sizeof CMTTailMap return Put LPCSTR ptr strMsgId sizeof MQMsg sizeof CMTTailMap 1 iSegmentFlag nPriority iFeedbackCode 应书写为 ptr m chMsgType MQ MT TAIL iSegmentFlag SF LASTSEGMENT strncpy ptr m pBody char pTail sizeof CMTTailMap return Put LPCSTR ptr strMsgId sizeof MQMsg sizeof CMTTailMap 1 iSegmentFlag nPriority iFeedbackCode 规则规则 33 比较操作符 赋值操作符 算术操作符 逻辑操作符 位域操作符等双目运算符前后 应加空格与操作数隔开 例 i i 1 if i 10 i i 2 应书写为 i i 1 if i 10 i ii 2 规则规则 34 逗号 分号后面应加空格 但前面不应加空格 例 for int ii 0 ii 10 ii 应书写为 for int ii 0 ii 10 for ii 0 ii 10 for ii 0 ii m nName str 应书写为 CString str stSet GetName strOrgName if str uname pOldSet m nName str 4 1 3括号使用括号使用 规则规则 37 复杂的表达式应使用括号以避免二义性 不应依赖运算符优先级 如 if i 0 i 12 p 1 规则规则 38 位运算时应使用括号 如 i nSumVal 4 规则规则 39 return 与 throw 非函数 不应使用括号 如 return nRetCode 4 2头头文件文件 规则规则 40 头文件应使用防止重复包含宏括整个头文件部分 宏名应为 模块名 HPP 或 模块名 H 注意 注意 endif 后必后必须须保留一个空行 否保留一个空行 否则则部分部分编译编译器会器会报报警告信息 警告信息 规则规则 41 本模块需要的头文件以及外部函数 应全部列在本模块头文件的首部且紧临防重复 包含宏 并按先系统级 公共级 应用级 本模块级的顺序摆放 尽量不在实现文件中包含除本模 块头文件外的其他头文件以及外部函数 规则规则 42 头文件引用禁止含路径信息 无论是全路径还是相对路径 规则规则 43 禁止在头文件中定义变量或常量 例 头文件 cis401 hpp ifndef MODULE NAME HPP define MODULE NAME HPP include include PUBLIB src include common hpp include include cispub hpp int g nUserCode 0 endif 例 实现文件 cis401 cpp include include cstring hpp include include cis401 hpp extern long GetFileSize LPCSTR sFileName cis401 hpp 应书写为 ifndef MODULE NAME HPP define MODULE NAME HPP include include include common hpp include cstring hpp include cispub hpp extern long GetFileSize LPCSTR sFileName extern int g nUserCode endif cis401 cpp 应书写为 include cis401 hpp int g nUserCode 0 4 3宏定宏定义义 建议建议 15 灵活使用编译宏解决平台或版本的兼容性问题 例 cpp ifdef WIN32 in WIN32 void printTrace LPCSTR lpName LPCSTR lpText char szTmp 4096 memset szTmp 0 sizeof szTmp va list argList va start argList lpText vsprintf szTmp lpText argList va end argList fprintf stderr s s s n StrCurrentTime YYYY MM DD HH MM SS GetBuffer 0 lpName szTmp else in UNIX void printTrace LPCSTR lpName LPCSTR lpText char szTmp 4096 memset szTmp 0 sizeof szTmp va list argList va start argList lpText vsprintf szTmp lpText argList va end argList fprintf stderr s s s n StrCurrentTime YYYY MM DD HH MM SS GetBuffer 0 lpName szTmp endif 应修改为 hpp ifdef WIN32 define vsprintf vsprintf endif cpp void printTrace LPCSTR lpName LPCSTR lpText char szTmp 4096 memset szTmp 0 sizeof szTmp va list argList va start argList lpText vsprintf szTmp lpText argList va end argList fprintf stderr s s s n StrCurrentTime YYYY MM DD HH MM SS GetBuffer 0 lpName szTmp 规则规则 44 宏表达式的变量应使用括号括 使用宏时应避免传递表达式给宏变量 例 define MAX a b a b a b 应书写为 define MAX a b a b a b 调用 int nMax MAX i b 应书写为 int nTmpi i int nTmpb b int nMax MAX nTmpi nTmpb 规则规则 45 单条语句构成的宏不应使用分号作为宏结束 多条语句构成宏时 应使用花括号括 宏体 例 define ThrowExceptionExt sFileName nErrCode sExtMsg ThrowFileExceptionExt FILE LINE sFileName nErrCode sExtMsg return nErrCode define RETCODE n return n 应书写成 define ThrowExceptionExt sFileName nErrCode sExtMsg ThrowFileExceptionExt FILE LINE sFileName nErrCode sExtMsg return nErrCode define RETCODE n return n 规则规则 46 构成宏体的语句必须完成 禁止包含语句块的部分 例 define CLEAR ALL n for int ii 0 ii n ii CLEAR ALL strlen str str ii 0 define CLEAR ALL n for int ii 0 ii n ii str ii 0 以上两例应书写为 define CLEAR ALL str n for int ii 0 ii n ii str ii 0 即使这样 代码依然是不安全的 应避免在宏中定义变量 规则规则 47 禁止使用宏替换关键字 如下列为不良写法 define MYENUM enum MYENUM err E DATE 1 E TIME 2 建议建议 16 使用 enum 或 const int 或 inline 函数代替宏 例 define MAX FRAME SIZE 1024 define ERR DATE 1 define ERR TIME 2 define ERR TASK NO 3 define ExitOnFail if g nErrCode 0 return g nErrCode 应书写为 const int MAX FRAME SIZE 1024 enum ERR TYPE ERR DATE 1 ERR TIME 2 ERR TASK NO 3 inline int ExitOnFail if g nErrCode 0 return g nErrCode 4 4变变量与常量量与常量 规则规则 48 避免使用与全局变量 外部变量同名的局部变量 禁止使用关键字 保留字 函数名 作为变量名 如下列为不良写法 例 int nMaxSize 100 int strlen 1 for int ii 0 ii 0 n c 应书写为 unsigned int c 127 char n 10 while n 0 n c 建议建议 23 不要将常量强制转换为变量 有时可能导致系统崩溃 4 5条件判断条件判断 规则规则 53 if 语句的判断条件必须是逻辑表达式 不应使用 C 默认的 0 为 false 非 0 为 true 的规则 如 例 char p strstr abc a if p 应书写为 char p strstr abc a if p NULL char p str while p p 应书写为 char p str while p 0 p for int ii 10 ii ii 应书写为 for int ii 10 ii 0 ii 规则规则 54 禁止对逻辑表达式进行比较操作 如 例 if ii 10 bQuit TRUE IsContinue FALSE 应书写成 if ii 10 bQuit IsContinue 规则规则 55 避免对浮点类型作等于或不等于判断 应根据应用的实际情况使用范围判断 如 金 额的小数位为两位 则判断金额是否为零 可以写成 if dAmount 0 0001 4 6空空间间申申请请与与释释放放 规则规则 56 使用 C 的 new 操作符申请空间 使用 delete 操作符释放空间 new 申请的数组 空间 应使用 delete 释放 申请空间后 释放空间前 应判断指针是否为 NULL 释放空间后应 赋值该指针为 NULL 避免重复释放空间 规则规则 57 尽量在申请空间的函数内部释放空间 否则应妥善传递申请的空间指针 并在合适 的时间释放 避免内存泄漏 4 7函数函数编编写写 规则规则 58 仔细选择函数的参数并尽量减少参数个数 没有参数时明确地使用 void 说明 参数 是数组类型的 使用数组类型而非指针类型 参数是类对象的 尽量使用对象的引用或对象指针 参数是大数据变量的 必须使用引用或指针 可默认值的参数尽量指定默认值 规则规则 59 函数入口点应检查每个参数的合法性 规则规则 60 仔细安排参数的位置 最常用的参数放置在最前面 输入参数尽量放置在左边 输 出参数尽量放置在右边 规则规则 61 显式声明函数的返回值 没有返回值的使用 void 说明 返回指针的函数 使用 NULL 作为错误返回 禁止返回局部变量的指针或引用 规则规则 62 必须完整处理函数返回码 并预留通用返回码的处理 避免新增加的返回码被忽略 例 int nRetCode CheckBusiness if nRetCode 1 return if nRetCode 2 return 应书写为 int nRetCode CheckBusiness if nRetCode 1 if nRetCode 1 return if nRetCode 2 return 规则规则 63 函数体不应超过 200 行代码 嵌套不应超过 5 层 功能复杂的函数应分拆为多个子 函数 但结构简单重复的函数 如包含大量的 switch 或分拆后需要传递大量参数的函数 功能联 系紧密 难以分拆的 可以超过 200 行 规则规则 64 能在循环体外完成的处理 应放置在循环体外 多重循环的 应将大循环放置在最 内层 规则规则 65 避免相同的代码段多处出现 应使用函数 inline 函数 宏组织这些代码 再多处调 用 增强代码的可维护性 规则规则 66 函数的功能应尽量简单与单一 面面俱到的函数难以理解 测试和维护 规则规则 67 编写重载函数时 应注意保持重载函数参数的差异 避免编写容易混淆的重载函数 例 hpp CString GetConfigure LPCSTR sItemName LPCSTR sDefValue CString GetConfigure LPCSTR sSegName LPCSTR sItemName LPCSTR sDefValue cpp CString strWrkStr GetConfigure System Sysname 报编译错误 mbiguous call to overloaded function 应书写为 CString GetConfigure LPCSTR sItemName LPCSTR sDefValue CString GetConfigure LPCSTR sSegName LPCSTR sItemName LPCSTR sDefValue 或 CString GetConfigure LPCS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论