华为技术有限公司C++语言编程规范.pdf
《华为技术有限公司C++语言编程规范.pdf》由会员分享,可在线阅读,更多相关《华为技术有限公司C++语言编程规范.pdf(57页珍藏版)》请在三一文库上搜索。
1、C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第1页,共57页 华为技术有限公司内部技术规范 DKBA 2979-2012.03 C+ 语言编程规范 2012年03月15日发布 2012年03月15日实施 华为技术有限公司 Huawei Technologies Co., Ltd. 版权所有侵权必究 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第2页,共57页 修订声明 本规范拟制与解释部门: 本规范的相关系列规范或文件: 替代或作废的其它规范或文件: 相关规范或文件的相互关系: 规范号主要起草部门专家主要评审部门专家修订情 况 DKB
2、Axxxx.x-xxxx.xx 研发能力中心系统工程 部: 郭曙光 00121837 王红超 00134169 李循律 46151 软件公司: 文滔 00119601 马洪波 00164562 赵玉锡 0039301 赵祎 00108293 邓赛兵 00101270 吴鹏 69403 融合通信: 张小林 58208 陈崇辉 58924 无线: 张振江 64529 陶永祥 120482 中软: 黄剑豪 152126 网络: 张伟118807 研发能力中心: 郭永生 00120218 张建保 00116237 中研: 王奇 00121935 无线:苏光牛00118740 软件公司:周代兵00120
3、359 张锦元 00160906 谢峰 00150451 张振国 00039875 陈春美 41639 邓春平 00036632 胡小翔 00160924 李玉华 39860 网络: 王玎 00168059 刘宏业 00121368 艾小平 52519 融合通信: 董志凌 46134 苏昆 00145871 潘会民 48511 成研所: 李朝阳 00117623 海思: 孙学全 00148680 IT: 戴强 51135 相关国际规范或文件一致性: C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第3页,共57页 目录 0说明 5 0.1前言 5 0.2代码总体原则
4、. 5 0.3与C语言编程规范的关系 6 0.4规范实施、解释 6 0.5术语定义 . 6 1常量 6 2初始化和类型转换 8 2.1声明、定义与初始化 8 2.2类型转换 . 10 3函数 . 12 3.1内联函数 . 12 3.2函数参数 . 13 3.3函数指针 . 14 4类 . 14 4.1类的设计 . 14 4.2构造、赋值和析构 17 4.3继承 21 4.4重载 24 5作用域、模板和 C+ 其他特性 25 5.1作用域 25 5.2模板 27 5.3其他 28 6资源分配和释放 . 28 7异常与错误处理 . 33 7.1异常 33 7.2错误处理策略 . 35 8标准库 .
5、 36 9程序效率 . 41 9.1C+ 语言特性的性能分级 41 9.2C+ 语言的性能优化指导 42 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第4页,共57页 10 并发 . 45 11 风格 . 48 11.1标示符命名与定义 48 11.2排版 48 11.3注释 49 11.4文件组织 . 49 12 可移植性 (兼容性) . 49 13 全球化 . 52 13.1多语言输入输出 52 13.2单一版本 . 53 13.3时区夏令时 . 54 14 业界编程规范和书籍 . 55 14.1业界编程规范 . 55 14.1.1google C+ code
6、 style (google C+ 编程指南 ) . 55 14.1.2C+ 编程规范 101条规则、准则与最佳实践 . 56 14.1.3Microsoft All-In-One Code Framework微软一站式示例代码库 . 56 14.2扩展学习材料 . 56 14.2.1C+ primer 56 14.2.2effective C+ / more effective C+ . 56 14.2.3Effective STL . 57 14.2.4inside the C+ object model . 57 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散
7、第5页,共57页 C+语言编程规范 0 说明 0.1 前言 随着业务的发展和产品架构的演进,越来越多的传统电信产品使用C+语言,很多新型产品更是把C+ 作为首选。 C+继承于 C,包含 C的所有特性,同时又增加了新语言特性,如面向对象、泛型设计等。目 前C+使用现状是:基础技能薄弱,陷入很多误区,不能很好地发挥C+的作用。为了帮助团队合理使 用C+,规避语言陷阱,特制定本规范。 0.2 代码总体原则 跟C语言编程一样,C+ 编程遵循通用原则: 1、清晰第一。清晰性是易于维护、易于重构的程序必需具备的特征。 2、简洁为美。简洁就是易于理解并且易于实现。 3、选择合适的风格,与代码原有风格保持一致
8、。 除此之外, C+编程还应该注意以下方面: 1、正确使用 C+ 面向对象技术使得程序结构清晰、简单,提高了代码的重用性,但又隐藏了很多内部实现细节,内存 模型复杂,不小心会误入陷阱,比如:拷贝构造函数,赋值操作符,析构函数,重载等。 为了简化代码,改善代码结构,提高编程效率,一些团队引入新特性和第三方库,如:模板技术、 STL、 Boost 等,由于缺乏足够的理解,使用中屡次发生问题,比如对迭代器(Iterator)使用不当导致功能失 常,甚至程序崩溃。所以,必须深入理解C+对象布局、内存模型等,了解编译器背后所做的处理,才 能在编程中知道如何正确使用。 2、安全高效 跟其他流行的高级语言、
9、脚本语言相比,C+ 运行速度快,天然适合开发核心通信部件,但是这些部件 对稳定性的要求非常高,不容许发生异常、失效以及崩溃。C+具有直接操作硬件、访问内存的能力, 提供了指针、地址运算等灵活特性,程序员可以任意发挥,增加了出错的几率。所以在追求速度与灵 活性的同时, 一定要注意保持程序的健壮性。在增强代码稳定性过程中,程序员通常采用if-else等防 御式编程,使得代码非常臃肿,可适当采用RAII 、智能指针等技术。 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第6页,共57页 0.3 与C语言编程规范的关系 本文在 华为技术有限公司C语言编程规范( 简称 C规范
10、 ) 基础上, 通过详细阐述如何规避C+语言复杂 性,避免 C+的低级错误,确保有效使用C+语言特性,代码易于维护。 C规范里面相同的内容,本规范不再重复。例如头文件、变量、表达式、代码编辑与编译、可测试性、 安全性、单元测试等章节经过审视,完全适合C+,本规范不再重复。标识符命名与定义、注释、排版 与格式等内容也适合C+,仅仅添加了少量的C+特有的规则和建议,合并成风格一章;函数章节增加 了内联函数、 函数参数等内容;可移植性增加了64位以及 C+专有的数据转换等内容;质量保证也符合 C+的需要,将资源分配和释放部分C+特有的内容编写成单独章节;宏、常量也符合C+,考虑到 C+ 普遍使用 c
11、onst ,增加了常属性(const)章节。 新增初始化和类型转换,类,作用域、模板与C+其他特性,异常与错误处理,并发,全球化等C+特 有的内容。 本规范和 C规范有冲突的地方,以本规范为准。 0.4 规范实施、解释 本规范制定了编写C+语言程序的基本原则、规则和建议。 本规范适用于公司内使用C+语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改 的代码应遵守本规范。 本规范由软件工程体系发布和维护。实施中遇到问题,可以到论坛 http:/ 在某些情况下需要违反本规范给出的规则时,相关团队必须通过一个正式的流程来评审、决策规则违 反的部分,个体程序员不得违反本规范中的相关规则。
12、 0.5 术语定义 原则 :编程时必须坚持的指导思想。 规则 :编程时强制必须遵守的约定。 建议 :编程时必须加以考虑的约定。 说明 :对此原则 / 规则 / 建议进行必要的解释。 示例 :对此原则 / 规则 / 建议从好、不好两个方面给出例子。 延伸阅读材料:建议进一步阅读的参考材料。 1 常量 不变的值更易于理解、跟踪和分析, 所以应该尽可能地使用常量代替变量,定义值的时候, 应该把 const 作为默认的选项。 规则 1.1 使用 const 常量取代宏 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第7页,共57页 说明:宏是简单的文本替换,在预处理阶段时完
13、成,运行报错时直接报相应的值;跟踪调试时也是显 示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。 示例: #define MAX_MSISDN_LEN (20) / 不好的例子 constint MAX_MSISDN_LEN = 20; / 好的例子 规则 1.2 一组相关的整型常量应定义为枚举 说明:之所以使用枚举,基于: 枚举比 #define 或const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从 而避免错误发生。 示例: /好的例子: enum DayOfWeeksunday,monday, tuesday, wednesday, thursday,
14、friday, saturday; enum Colorblack, blue, white, red, purple; BOOL ColorizeCalendar(DayOfWeek today, Color todaysColor); ColorizeCalendar(blue, sunday); / 编译报错, Blue 和Sunday 位置错误 /不好的例子 : constint sunday = 0; constint monday = 1; constint black = 0; constint blue = 1; BOOL ColorizeCalendar(int today,
15、 int todaysColor); ColorizeCalendar(blue, sunday); / 不会报错 当枚举值需要对应到具体数值时,须在声明时显示赋值。否则不需要显式赋值,以避免重复赋值, 降低维护 (增加、删除成员) 工作量。 示例: /好的例子: S协议里定义的设备ID 值,用于标识设备类型 enum TDeviceType DEV_UNKNOWN = -1, DEV_DSMP = 0, DEV_ISMG = 1, DEV_WAPPORTAL = 2 ; 程序内部使用,仅用于分类的情况,不应该进行显式的赋值。 示例: /好的例子:程序中用来标识会话状态的枚举定义 enum T
16、SessionState SESSION_STATE_INIT, SESSION_STATE_CLOSED, SESSION_STATE_WAITING_FOR_RSP ; 应当尽量避免枚举值重复,如必须重复也要用已定义的枚举来修饰,例如: typedef enum RTCP_SR = 200, RTCP_MIN_TYPE = RTCP_SR, /must be lowest known type RTCP_RR = 201, C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第8页,共57页 RTCP_SDES = 202, RTCP_BYE = 203, RTCP_
17、APP = 204, RTCP_RTPFB = 205, RTCP_PSFB = 206, RTCP_XR = 207, RTCP_RSI = 208, RTCP_PUBPORTS = 209, RTCP_MAX_TYPE = RTCP_PUBPORTS /must be highest known type rtcp_type_t; 规则 1.3 不相关的常量,即使取值一样,也必须分别定义 说明:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。 示例: /好的例子:协议 A和协议 B,手机号 (MSISDN)的长度都是 20 。 unsignedconstint A_MAX_MSI
18、SDN_LEN = 20; unsignedconstint B_MAX_MSISDN_LEN = 20; /或者使用不同的名字空间: namespace alib unsignedconstint MAX_MSISDN_LEN = 20; namespace blib unsignedconstint MAX_MSISDN_LEN = 20; 建议 1.1 尽可能使用 const 说明:在声明的变量或参数前加上关键字const 用于指明变量值不可被篡改。类成员函数加上const 限定符表明该函数不会修改类成员变量的状态。 使用 const 常见的场景: 函数参数:传递引用时,如果函数不会修改
19、传入参数, 该形参应声明为const 。 成员函数:访问函数( 如get 函数 ) ;不修改任何数据成员的函数;未调用非const 函数、未返回数 据成员的非 const 指针或引用的函数。 数据成员:如果数据成员在对象构造之后不再发生变化, 可将其定义为const 。 2 初始化和类型转换 2.1 声明、定义与初始化 规则 2.1 禁止用 memcpy 、memset初始化非 POD 对象 说明: POD 全称是“ Plain Old Data”,是 C+ 98标准 (ISO/IEC 14882, first edition, 1998-09-01) 中引入的一个概念, POD类型主要包括i
20、nt, char, float,double ,enumeration ,void ,指针等原始 类型及其集合类型,不能使用封装和面对对象特性(如用户定义的构造/ 赋值 / 析构函数、基类、虚函 数等)。 C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第9页,共57页 由于非 POD 类型比如非集合类型的class 对象,可能存在虚函数,内存布局不确定,跟编译器有关,滥 用内存拷贝可能会导致严重的问题。 即使对集合类型的class ,使用直接的内存拷贝和比较,破坏了信息隐蔽和数据保护的作用,也不提倡 memcpy 、memset操作。 示例:产品程序异常退出(cor
21、e dump)。 经过现场环境的模似,程序产生COREDUMP,其原因是:在初始化函数内使用memset(this, 0, sizeof(*this)进行了类的初始化,将类的虚函数表指针被清空,从而导致使用空指针。 解决方案:使用C+构造函数初始化,不要使用memset函数初始化类对象。 建议 2.1 变量使用时才声明并初始化 说明:变量在使用前未赋初值,是常见的低级编程错误。使用前才声明变量并同时初始化,非常方便 地避免了此类低级错误。 在函数开始位置声明所有变量,后面才使用变量,作用域覆盖整个函数实现,容易导致如下问题: 程序难以理解和维护:变量的定义与使用分离。 变量难以合理初始化:在函
22、数开始时,经常没有足够的信息进行变量初始化,往往用某个默认的 空值 (比如零 ) 来初始化, 这通常是一种浪费,如果变量在被赋于有效值以前使用,还会导致错误。 遵循变量作用域最小化原则与就近声明原则,使得代码更容易阅读, 方便了解变量的类型和初始值。 特别是, 应使用初始化的方式替代声明再赋值。 示例: /不好的例子:声明与初始化分离 string name; /声明时未初始化:调用缺省构造函数 / . name= ” zhangsan” ; /再次调用赋值操作符函数;声明与定义在不同的地方,理解相对困难 /好的例子:声明与初始化一体,理解相对容易 string name(” zhangsan
23、” ); /调用一次构造函数 建议 2.2 避免构造函数做复杂的初始化,可以使用“init”函数 说明:正如函数的变量都在函数内部初始化一样,类数据成员最好的初始化场所就是构造函数,数据 成员都应该尽量在构造函数中初始化。 以下情况可以使用init()函数来初始化: 需要提供初始化返回信息。 数据成员初始化可能抛异常。 数据成员初始化失败会造成该类对象初始化失败,引起不确定状态。 数据成员初始化依赖this指针:构造函数没结束, 对象就没有构造出来,构造函数内不能使用this 成员; 数据成员初始化需要调用虚函数。在构造函数和析构函数中调用虚函数,会导致未定义的行为。 示例:数据成员初始化可能
24、抛异常: class CPPRule C+语言编程规范内部公开 2012-03-19 华为机密,未经许可不得扩散第10页,共57页 public: CPPRule():size_(0), res (null) ; / 仅进行值初始化 long init(int size) /根据传入的参数初始化size_, 分配资源 res private: int size_; ResourcePtr* res; ; /使用方法: CPPRule a; a.init(100); 建议 2.3 初始化列表要严格按照成员声明顺序来初始化它们 说明:编译器会按照数据成员在类定义中声明的顺序进行初始化,而不是按照初
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 技术有限公司 C+ 语言 编程 规范
链接地址:https://www.31doc.com/p-5518591.html