logo资料库

华为C++编程规范.pdf

第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
资料共57页,剩余部分请下载后查看
0 说明
0.1 前言
0.2 代码总体原则
0.3 与C语言编程规范的关系
0.4 规范实施、解释
0.5 术语定义
1 常量
2 初始化和类型转换
2.1 声明、定义与初始化
2.2 类型转换
3 函数
3.1 内联函数
3.2 函数参数
3.3 函数指针
4 类
4.1 类的设计
4.2 构造、赋值和析构
4.3 继承
4.4 重载
5 作用域、模板和C++其他特性
5.1 作用域
5.2 模板
5.3 其他
6 资源分配和释放
7 异常与错误处理
7.1 异常
7.2 错误处理策略
8 标准库
9 程序效率
9.1 C++语言特性的性能分级
9.2 C++语言的性能优化指导
10 并发
11 风格
11.1 标示符命吊与定义
11.2 排版
11.3 注释
11.4 文件组织
12 可移植性(兼容性)
13 全球化
13.1 多语言输入输出
13.2 单一版本
13.3 时区夏令时
14 业界编程规范和书籍
14.1 业界编程规范
14.1.1 《google C++ code style》 (google C++编程指南)
14.1.2 《C++编程规范101条规则、准则与最佳实践》
14.1.3 Microsoft All-In-One Code Framework《微软一站式示例代码库》
14.2 扩展学习材料
14.2.1 C++ primer
14.2.2 effective C++ / more effective C++
14.2.3 Effective STL
14.2.4 inside the C++ object model
C++语言编程规范 内部公开 华为技术有限公司内部技术规范 DKBA 2979-2012.03 C++语言编程规范 2012年03月15日发布 2012年03月15日实施 华为技术有限公司 Huawei Technologies Co., Ltd. 版权所有 侵权必究 2012-03-19 华为机密,未经许可不得扩散 第1页,共57页
C++语言编程规范 内部公开 本规范拟制与解释部门: 修订声明 本规范的相关系列规范或文件: 相关国际规范或文件一致性: 相关国际规范或文件一致性: 替代或作废的其它规范或文件: 相关规范或文件的相互关系: 规范号 主要起草部门专家 主要评审部门专家 DKBAxxxx.x-xxxx.xx 研发能力中心系统工程 研发能力中心: 修订情 况 部: 郭永生00120218 张建保00116237 郭曙光00121837 中研: 王红超00134169 王奇00121935 李循律46151 软件公司: 无线:苏光牛00118740 软件公司:周代兵00120359 文滔00119601 张锦元00160906 谢峰00150451 马洪波00164562 张振国00039875 陈春美41639 赵玉锡0039301 邓春平00036632 胡小翔00160924 赵祎00108293 李玉华39860 邓赛兵00101270 网络: 吴鹏69403 融合通信: 张小林58208 陈崇辉58924 无线: 张振江64529 陶永祥120482 中软: 王玎00168059 刘宏业00121368 艾小平52519 融合通信: 董志凌46134 苏昆00145871 潘会民48511 成研所: 李朝阳00117623 海思: 黄剑豪152126 孙学全00148680 网络: IT: 张 伟118807 戴强51135 2012-03-19 华为机密,未经许可不得扩散 第2页,共57页
C++语言编程规范 内部公开 目 录 0 说明 ...................................................... 5 0.1 前言 ...................................................................................................................................... 5 0.2 代码总体原则 ....................................................................................................................... 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 标准库 ................................................... 36 9 程序效率 ................................................. 41 9.1 9.2 C++语言特性的性能分级.................................................................................................... 41 C++语言的性能优化指导.................................................................................................... 42 2012-03-19 华为机密,未经许可不得扩散 第3页,共57页
C++语言编程规范 内部公开 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.2 14.1.3 14.1.1 14.1 业界编程规范 ..................................................................................................................... 55 《google C++ code style》 (google C++编程指南) ......................................... 55 《C++编程规范101条规则、准则与最佳实践》 ............................................... 56 Microsoft All-In-One Code Framework《微软一站式示例代码库》 ................. 56 14.2 扩展学习材料 ..................................................................................................................... 56 C++ primer ........................................................................................................ 56 effective C++ / more effective C++ ................................................................... 56 Effective STL ..................................................................................................... 57 inside the C++ object model ............................................................................. 57 14.2.1 14.2.2 14.2.3 14.2.4 2012-03-19 华为机密,未经许可不得扩散 第4页,共57页
C++语言编程规范 内部公开 0 说明 0.1 前言 C++语言编程规范 随着业务的发展和产品架构的演进,越来越多的传统电信产品使用C++语言,很多新型产品更是把C++ 作为首选。C++继承于C,包含C的所有特性,同时又增加了新语言特性,如面向对象、泛型设计等。目 前C++使用现状是:基础技能薄弱,陷入很多误区,不能很好地发挥C++的作用。为了帮助团队合理使 用C++,规避语言陷阱,特制定本规范。 0.2 代码总体原则 跟C语言编程一样,C++编程遵循通用原则: 1、清晰第一。清晰性是易于维护、易于重构的程序必需具备的特征。 2、简洁为美。简洁就是易于理解并且易于实现。 3、选择合适的风格,与代码原有风格保持一致。 除此之外,C++编程还应该注意以下方面: 1、正确使用C++ 面向对象技术使得程序结构清晰、简单,提高了代码的重用性,但又隐藏了很多内部实现细节,内存 模型复杂,不小心会误入陷阱,比如:拷贝构造函数,赋值操作符,析构函数,重载等。 为了简化代码,改善代码结构,提高编程效率,一些团队引入新特性和第三方库,如:模板技术、STL、 Boost等,由于缺乏足够的理解,使用中屡次发生问题,比如对迭代器(Iterator)使用不当导致功能失 常,甚至程序崩溃。所以,必须深入理解C++对象布局、内存模型等,了解编译器背后所做的处理,才 能在编程中知道如何正确使用。 2、安全高效 跟其他流行的高级语言、脚本语言相比,C++运行速度快,天然适合开发核心通信部件,但是这些部件 对稳定性的要求非常高,不容许发生异常、失效以及崩溃。C++具有直接操作硬件、访问内存的能力, 提供了指针、地址运算等灵活特性,程序员可以任意发挥,增加了出错的几率。所以在追求速度与灵 活性的同时,一定要注意保持程序的健壮性。在增强代码稳定性过程中,程序员通常采用if-else等防 御式编程,使得代码非常臃肿,可适当采用RAII、智能指针等技术。 2012-03-19 华为机密,未经许可不得扩散 第5页,共57页
C++语言编程规范 内部公开 0.3 与C语言编程规范的关系 本文在《华为技术有限公司C语言编程规范》(简称C规范)基础上,通过详细阐述如何规避C++语言复杂 性,避免C++的低级错误,确保有效使用C++语言特性,代码易于维护。 C规范里面相同的内容,本规范不再重复。例如头文件、变量、表达式、代码编辑与编译、可测试性、 安全性、单元测试等章节经过审视,完全适合C++,本规范不再重复。标识符命名与定义、注释、排版 与格式等内容也适合C++,仅仅添加了少量的C++特有的规则和建议,合并成风格一章;函数章节增加 了内联函数、函数参数等内容;可移植性增加了64位以及C++专有的数据转换等内容;质量保证也符合 C++的需要,将资源分配和释放部分C++特有的内容编写成单独章节;宏、常量也符合C++,考虑到C++ 普遍使用const,增加了常属性(const)章节。 新增初始化和类型转换,类,作用域、模板与C++其他特性,异常与错误处理,并发,全球化等C++特 有的内容。 本规范和C规范有冲突的地方,以本规范为准。 0.4 规范实施、解释 本规范制定了编写C++语言程序的基本原则、规则和建议。 本规范适用于公司内使用C++语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改 的代码应遵守本规范。 本规范由软件工程体系发布和维护。实施中遇到问题,可以到论坛 http://hi3ms.huawei.com/group/1735/threads.html上讨论。 在某些情况下需要违反本规范给出的规则时,相关团队必须通过一个正式的流程来评审、决策规则违 反的部分,个体程序员不得违反本规范中的相关规则。 0.5 术语定义 原则:编程时必须坚持的指导思想。 规则:编程时强制必须遵守的约定。 建议:编程时必须加以考虑的约定。 说明:对此原则/规则/建议进行必要的解释。 示例:对此原则/规则/建议从好、不好两个方面给出例子。 延伸阅读材料:建议进一步阅读的参考材料。 1 常量 不变的值更易于理解、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时候,应该把const 作为默认的选项。 规则1.1 使用const常量取代宏 2012-03-19 华为机密,未经许可不得扩散 第6页,共57页
C++语言编程规范 内部公开 说明:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显 示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。 示例: #define MAX_MSISDN_LEN (20) //不好的例子 const int MAX_MSISDN_LEN = 20; //好的例子 规则1.2 一组相关的整型常量应定义为枚举 说明:之所以使用枚举,基于:  枚举比#define或const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从 而避免错误发生。 示例: //好的例子: enum DayOfWeek{sunday,monday, tuesday, wednesday, thursday, friday, saturday}; enum Color{black, blue, white, red, purple}; BOOL ColorizeCalendar(DayOfWeek today, Color todaysColor); ColorizeCalendar(blue, sunday); //编译报错,Blue和Sunday位置错误 //不好的例子: const int sunday = 0; const int monday = 1; const int black = 0; const int blue = 1; BOOL ColorizeCalendar(int today, int todaysColor); ColorizeCalendar(blue, sunday); //不会报错  当枚举值需要对应到具体数值时,须在声明时显示赋值。否则不需要显式赋值,以避免重复赋值, 降低维护(增加、删除成员)工作量。 示例: //好的例子:S协议里定义的设备ID值,用于标识设备类型 enum TDeviceType { DEV_UNKNOWN = -1, DEV_DSMP = 0, DEV_ISMG = 1, DEV_WAPPORTAL = 2 }; 程序内部使用,仅用于分类的情况,不应该进行显式的赋值。 示例: //好的例子:程序中用来标识会话状态的枚举定义 enum TSessionState { 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, 2012-03-19 华为机密,未经许可不得扩散 第7页,共57页
C++语言编程规范 内部公开 RTCP_SDES = 202, RTCP_BYE = 203, RTCP_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。 unsigned const int A_MAX_MSISDN_LEN = 20; unsigned const int B_MAX_MSISDN_LEN = 20; //或者使用不同的名字空间: namespace alib { unsigned const int MAX_MSISDN_LEN = 20; } namespace blib { unsigned const int MAX_MSISDN_LEN = 20; } 建议1.1 尽可能使用const 说明:在声明的变量或参数前加上关键字const用于指明变量值不可被篡改 。类成员函数加上const 限定符表明该函数不会修改类成员变量的状态。 使用const常见的场景:  函数参数:传递引用时,如果函数不会修改传入参数, 该形参应声明为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类型主要包括int, char, float,double,enumeration,void,指针等原始 类型及其集合类型,不能使用封装和面对对象特性(如用户定义的构造/赋值/析构函数、基类、虚函 数等)。 2012-03-19 华为机密,未经许可不得扩散 第8页,共57页
分享到:
收藏