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页