开发部C与C编码规范_第1页
开发部C与C编码规范_第2页
开发部C与C编码规范_第3页
开发部C与C编码规范_第4页
开发部C与C编码规范_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、本文格式为Word版,下载可任意编辑 开发部,C与C编码规范 开发部 C C 与 与 C+ 编码规范 拟制: 日期: 审核: 日期: 批准: 日期: 文档编号: 创立日期: 结果修改日期: 版 本 号:1.0.0 电子版文件名: 文档修改记录 修改日期 修改人 修改说明 版本号 修改页 目 目 录 录 1. 概述 5 1.1. 引言 5 1.2. 考前须知 5 2. 命名规范 6 2.1. namespace 6 2.2. class(类) 6 2.3. Structure 6 2.4. 变量 7 2.4.1. 构成方式 7 2.4.2. 变量作用域 7 2.4.3. 变量类型 7 2.5.

2、常数 8 2.6. 函数 8 2.7. 全局标识符 9 3. 源文件样式 10 3.1. 文件名后缀 10 3.2. 典型式样 10 3.2.1. 版权信息 11 3.2.2. using/include 12 3.2.3. Class 12 3.2.4. Class 成员变量 13 3.2.5. 构造函数 13 3.2.6. 类成员函数 13 4. 语句 14 4.1. 简单语句 14 4.2. 复合语句(代码块) 14 4.3. 返回语句 15 4.4. if,if-else,if else-if else 语句 15 4.5. for 语句 16 4.6. while 语句 16 4.7

3、. do-while 语句 16 4.8. switch 语句 17 4.9. try-catch 语句 17 4.10. 操作符重载 错误! 未定义书签。 4.10.1. 赋值操作符(=) 错误! 未定义书签。 5. 解释 19 5.1. 代码修改 19 5.2. 函数解释 19 5.3. 行解释 20 5.4. 代码段解释 20 6. 代码编写格式 21 6.1. 代码样式 21 6.2. 缩进 21 6.3. 页宽 21 6.4. 对 21 6.5. 括号 22 7. 目录结构 23 7.1. 一级目录 23 7.2. dev 目录 24 7.3. etc 目录 24 8. c+程序约定

4、 25 8.1. 编译(unix/linux) 25 8.2. 异常 25 8.3. 操作符重载 25 8.4. 封装 26 8.5. 内存 26 8.6. 数据库编程 26 8.7. 性能 26 1. 概述 1.1. 引言 定义这个规范的目的是为了使工程中所有的文档都保持一致的风格,增加可读性,减少人员变更/工程协作的本金,主要是基于以下几个理由: 1、 软件 80%以上的生命周期在维护阶段 2、 任何工程都很难从头到尾维护由原来维护,风格统一、格式规范的编码可大大提高可读性,减少新开发人员上手的时间。 3、 协作开发或对外发布的产品,代码具有可理解性特别重要。 1.2. 考前须知 1、 制

5、定本规范的目的是为了让代码清楚整齐、加强可读性。所有编码务必围绕此原则,即使是本规范中未特别指明 2、 本规范不适用于各种开源代码。 3、本规范正文中中 黑体部分为重点要求,每个研发人员务必遵守。 2. 命名规范 2.1. namespace namespace 的名字应当都是由一个小写单词组成的。 namespace pub 2.2. class (类) 每个单词的首字母要大写。与文件一样,每个类应当有一个解释头用来说明该类的各个方面。每单词的首字母大写,其它字母小写,不加分隔符,前跟C如:CRatedCdr。 /* * A class representing a set of packe

6、t and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */ 2.3. Structure 每单词的首字母大写,其它字母小写,不加分隔符,前跟S如:SRatedCdr;说明:如无特别必要,Struct 的命名可以遵循 Class 的命名。Struct 中的数据的命名遵循 Class 的 Member 的命名。 2.4. 变量 2.4.1. 构成方式 命名的构成方式为 变量作用域 + 变量类型 + 基本

7、名 说明: 1、 变量作用域说明变量的作用范围,用小写,其后跟 。 2、 变量类型说明变量的数据类型,用小写; 3、 基本名,由一个或数个单词组成,构成主谓、动宾等形式,单词的第一个字母大写,其他字母小写,如 Count、RatedCharge。 2.4.2. 变量作用域 变量类型 前缀 举例 解释 全局变量 g g nMaxBorrowDay 1、 g 说明此变量是全局变量 2、 n 指此变量是一整数 3、 MaxBorrowDay 是基本名 局部变量 无 nCount 1、n 指此变量是一整数 2、Count 是基本名 类成员变量 sm m_nStudentCount sm_nStuden

8、tCount 1、m 说明此变量是类成员变量 2、s 指明此变量是静态变量 3、n 指此变量是一整数 4、StudentCount 是基本名 2.4.3. 变量类型 标志 类型描述 举例 b boolean flag (TRUE, FALSE) BOOL bAbort; ch Character char chInput; n 16-bit signed integer int16 nCount; i 32-bit signed integer int32 iAmount; l 64-bit signed integer int64 llAmount; str String string st

9、rBuf; sz zero-terminated character array char* szString; p pp Pointer(指针) 指针的指针 int32* pNumber; int32* ppNumbers; a array aLine2; f Float fAmount; d double dExRate fp filepointer(File *) fpFileHandle; c class CFoo cFoo; s struct SUserInfo sUserInfo; list list/vector SUserInfoList listUserInfo; dt da

10、te dtCreated tm time tmStarted dtm datetime dtmValidate it STL 中的 iterator itFoundId map map map int ,char * mapSt; set set set int setCustomerId 2.5. 常数 全部大写,词与词之间以_ _ 为分隔符。如: MAX_ _ DAY_ _ COUNT 常量的使用方式建议为 const 方式声明,尽量少用 define。 2.6. 函数 动词小写后加_分隔符,_后所跟的第一个词小写其他字头大写,只允许一个分隔符。如:get_inputString() co

11、nst int MAX_DAY_COUNT =3; const char ATTR_SERV_CLASS_ID = serv_class_id; 2.7. 全局标识符 所有的全局类、全局枚举类型、全局类型定义、全局函数、全局常数、全局变量务必带模块前缀,以保证其全局唯一性。 3. 源文件样式 3.1. 文件名后缀 所有的 c/c+文件都务必遵守如下的样式规矩。 c/c+程序使用以下文件后缀: 文件类别 文件后缀 头文件 .h C 源代码 .c 标准 c+程序 .cpp Proc 源代码 .pc 字节码文件(windows) .obj 字节码文件(unix/linux) .o 字节码文件 包 (

12、windows) .lib 字节码文件 包 (unix/linux) .a 动态链接库(windows) .dll 动态链接库(unix/linux) .so 3.2. 典型式样 的 典型的 c+头 头 文件(.h) 式样 /* 版权信息 修改日志 */ #ifndef _FILENAME_H #define _FILENAME_H Using namespace Include . /* 类描述*/ Class Public 变量与函数。 构造函数(); /*受保护类变量描述*/ 受保护类变量; /*受保护类函数描述*/ 受保护类函数(); #endif / _FILENAME_H 3.2.

13、1. 版权信息 头部描述文件名、内容、修改记录。修改记录包括日期(YYYY/MM/DD)、创立者/修改者、修改内容,新增的修改记录排在最前。 源程序头的解释格式采用 doxygen 风格的形式。 版权信息务必在 C/C+ 文件的开头: /*! * file cccom.cpp * brief * This file defines the proxy for all communication classes. Also possible * events and errors are defined. * * Copyright (c) 2022,2022 OnewaveInc. * RCS

14、: $Id$ * * History * 1996/10/25 ReWe integration of missing return values * 1996/10/14 Andreas Welsing #pragma pack() inserted */ 其中 Copyright 和 RCS 两行是固定的,务必包含,RCS 行从 CVS check out 后会将 $Id$ 变成类似下面的内容,同时随版本的更新会自动改变: $Id: SBAccBadInvoice.cc,v 1.1.2.65 2022/01/21 06:28:49 build Exp $ 其他不需要出现在 doxygen

15、的信息也可以包含在这里。 3.2.2. using/include using 行要在 include 行之前,include 中标准的包名要在本地的包名之前,而且依照字母顺序排列。其中 #include 表示在当前目录或用户指定目录下寻觅头文件,#include表示在系统路径目录下寻觅头文件。 Using namespace std; #include stdio #include string.h 3.2.3. Class 为便于界定,每个单词的首字母要大写。与文件一样,每个类应当有一个解释头用来说明该类的各个方面。 /* * A class representing a set of p

16、acket and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */ 类声明换行紧跟在解释头后面,class 关键字由行首开始书写,后跟类名称。界定符 和 ; 应独占一行,并与 class 关键字左对其。类要以行为为中心,大多数用户关心的是类的接口与其提供的服务,而不是其实现。 访问说明符:访问说明符(public, private, 或 protected)应当独占一行,并与类声明中的class关键

17、字左对其。 正确地使用 const:把不改变对象规律状态的成员都标记为 const 成员不仅有 利于用户对成员的理解,更可以最大化对象使用方式的灵活性及合理性。 初始化列表:应当尽可能通过构造函数的初始化列表来初始化成员和基类。 public class Account: public Observable public: Account( int myMoney ) : moneyAmount( myMoney ) ; const int getSafeMoney() const / . private: int moneyAmount; 3.2.4. Class 成员变量 接下来是类的成员

18、变量: /* * Packet counters */ protected int m_anPackets; public 的成员变量务必有详尽的解释。proceted、private 和 namespace 定义的成员变量假如名字含义明确的话,可以没有解释。 3.2.5. 构造函数 接下来是构造函数,它应当用递增的方式写(譬如:参数多的写在后面)。 3.2.6. 类成员 函数 在每个函数的前头,要进行以下方面的些解释: 各解释部分 解释描述 Brief 函数的功能描述(重点) Param 参数说明(重点) Return 函数返回值的说明(重点) 例如: /*! * brief Close t

19、he EPP service * param * service_name : service name * mode : close mode: 0 wait , 1 - force * return * CEPP_OK 成功 * CEPP_ERROR 执行失败,错误代码和错误信息通过 epp_errmsg 获取 */ 4. 语句 4.1. 简单语句 每行至多包含一条语句. . argv+; / 正确 argc-; / 正确 argv+; argc-; / 避免 4.2. 复合语句 (代码块) 复合语句是包含在大括号中的语句序列,形如 语句 : 被括中的语句应当较之复合语句缩进一个层次 左大

20、括号 与 右大括号 均 应另起一行并与复合语句首行对齐 。 大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如 if-else 或 for操纵结构的一部分。这样便于添加语句而无需担忧由于忘了加括号而引入 bug。 4.3. 返回语句 一个带返回值的 return 语句不使用小括号(),除非它们以某种方式使返回值更为显见。例如: return; return MyDisk.size(); / 正确 return (size 0 ? size :defaultSize); 4.4. if ,if-else ,if else-if else 语句 if- -e else 语句应当具有如下格式

21、: if (condition) statements; if (condition) statements; else statements; if (condition) statements; else if (condition) statements; else statements; 注意:if 语句总是用和括起来,避免使用如下简单引起错误的格式: if (condition) statement; /尽量避免 4.5. for 语句 一个 r for 语句应当具有如下格式: for (initialization; condition; update) statements; 一

22、个空的 for 语句(所有工作都在初始化,条件判断,更新子句中完成)应当具有如下格式: for (initialization; condition; update); 当在 for 语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致繁杂度提高。若需要,可以在 for 循环之前(为初始化子句)或 for 循环末尾(为更新子句)使用单独的语句 。 4.6. while 语句 一个 while 语句应当具有如下格式: while (condition) statements; 一个空的 while 语句应当具有如下格式: while (condition); 4.7. do-whi

23、le 语句 一个 do-while 语句应当具有如下格式: do statements; while (condition); 4.8. switch 语句 一个 h switch 语句应当具有如下格式: switch (condition) case ABC: statements; /* falls through */ case DEF: statements; break; case XYZ: statements; break; default: statements; break; case 顺着往下执行时(由于没有 break 语句),寻常应在 break 语句的位置添加解释。上

24、面的例如代码中就包含解释/* falls through */。 4.9. try-catch 语句 一个 try-catch 语句应当具有如下格式: try statements; catch (ExceptionClass e) statements; 5. 解释 c/c+的解释以最大提高可读性为原则,解释不宜过多或过少。 5.1. 代码修改 代码更新时,需要在 CVS 的 Log Info 中说明姓名、日期、更新理由。 5.2. 函数解释 在每个函数的前头,要进行以下方面的些解释: 各解释部分 解释描述 Brief 函数的功能描述(重点) Param 参数说明(重点) Return 函数

25、返回值的说明(重点) 例如: /*! * brief Close the EPP service * param * service_name : service name * mode : close mode: 0 wait , 1 - force * return * CEPP_OK 成功 * CEPP_ERROR 执行失败,错误代码和错误信息通过 epp_errmsg 获取 */ 5.3. 行解释 直接在本行代码后加/进行解释 if( condition ) /your comments 5.4. 代码段解释 对代码段的解释信息在代码段前说明。 /* */ if( a = b ) 6.

26、 代码编写格式 6.1. 代码样式 代码应当用 unix 的格式,而不是 windows 的(譬如:回车变成回车+换行)。 6.2. 缩进 缩进应当是每行 4 个空格。不要在源文件中保存 Tab 字符。在使用不同的源代码管理工具时 Tab 字符将由于用户设置的不同而扩展为不同的宽度。 假如你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来阻止保存 Tab 字符, 函数是通过 UltrEdit 中先设定 Tab 使用的长度室 4 个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。 6.3. 页宽 页宽应当设置为 80 字符.

27、 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何状况下, 超长的语句应当在一个逗号或者一个操作符后折行. 一条语句折行后, 应当比原来的语句再缩进 4 个字符。 6.4. 对 中的语句应当单独作为一行. 例如, 下面的第 1 行是错误的, 第 2 行是正确的: if (i0) i + ; / 错误, 和 在同一行 if (i0) i + ; / 正确, 单独作为一行 语句永远单独作为一行。假如可能,语句应当缩进到与其相对应的那一行相对齐的位置。 6.5. 括号 左括号和后一个字符之间不应当出现空格, 同样, 右括号和前一个字符之间也不应当出现空格。下面的

28、例子说明括号和空格的错误及正确使用: CallProc( AParameter ); / 错误 CallProc(aParameter); / 正确 不要在语句中使用无意义的括号. 括号只应当为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法: if (i) = 42) / 错误 - 括号毫无意义 if (i = 42) or (j = 42) / 正确 - 确实需要括号 7. 目录结构 目录结构 目录 工程名称 common include lib dev bin lib conf log etc make shell conf src 子系统 common 子模块 子模块. doc 7.1. 一级目录 目录 说明 例子 dev 用于存放编译完成的可执行代码、程序库、配置文件、日志文件。用于研发人员测试及版本发布的目录 etc 存放编译脚本、模版配置文件、shell 脚本 通过编译脚本,可将 src 下的源码编译生成可执行程序,并放置到 dev的目录下;同时可将模版配置文件、shell 脚本也放置到 dev 的目录下, 以供开发测试使用。 src 各子系统的源码存放目录。 common 存放通用库以及开源代码的目录。 doc 保存 code 的流程、算法等设计文件。

温馨提示

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

评论

0/150

提交评论