华为C++语言编程规范

5星(超过95%的资源)
所需积分/C币:39 2013-12-01 15:39:44 1.28MB PDF
291
收藏 收藏
举报

华为C++语言编程规范,内部资料
se 语言编程规范 内部公开 目录 0说明 前言 代码总体原则 与语言编程规范的关系 规范实施、解释 术语定义 1常量 6 2初始化和类型转换 声明、定义与初始化 类型转换 3函数 12 内联函数 函数参数 函数指针 4类 ...14 类的设计 构造、赋值和析构 继承 重载 5作用域、模板和C+其他特性 ..25 作用域 模板 其他 6资源分配和释放 28 7异常与错误处理 33 异常 错误处理策略 8标准库 36 9程序效率 语言特性的性能分级 语言的性能优化指导 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 0并发 45 11风格 48 标小符命名与定义 排版 注释 文件组织 12可移植性(兼容性). 49 13全球化 52 多语言输入输出 单一版本 时区夏令时 14业界编程规范和书籍 55 业界编程规 编程指南 《编程规范条规则、准则与最佳实践》 《微软一站式示例代码库》 扩展学习材料 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 语言编程规范 0说明 前言 随着业务的发展和产品架构的演进,越来越多的传统电信产品使用C++语言,很多新型产品更是把C+ 作为首选。C艹继承于C,包含C的所有特性,同时又增加了新语言特性,如面向对象、泛型设计等。目 前C-+使用现状是:基础技能薄弱,陷入很多误区,不能很好地发挥C++的作用。为了帮助团队合理使 用C-+,规避语言陷阱,特制定本规范 代码总体原则 毘C语言编稈一样,C++编稈遵循通用原则: 1、清晰第一。清晰性是易于维护、易于重构的程序必需只备的特征。 2、简洁为美。简洁就是易于理解并且易于实现。 3、选择合适的风格,与代码原有风格俣持一致。 除此之外,C+编程还应该注意以下方面 1、正确使用C+ 面向对象技术使得程序结枃清晰、简单,提高了代码的重用性,但又隐藏了很多內部实现细节,内存 模型复杂,不小心会误入陷阱,比如:拷贝构造函数,赋值操作符,析构函数,重载等 为了简化代码,改善代码结构,提髙编程效率,一些团队引入新特性和第三方库,如:模板技术、STL、 Bost等,由于缺乏足够的理解,使用中屡次发生问题,比如对达代器( Iterator)使用不当导致功能失 常,甚至稈序崩溃。所以,必须深入理解C艹+对象布局、內存模型等,了解编译器背后所做的处理,才 能在编程中知道如何止确使用 2、安全高效 跟其他流行的高级语言、脚本语言相比,C艹+运行速度快,天然适合开发核心通信部件,但是这些部件 对稳定性的要求非常高,不容许发生异常、失效以及崩溃。C艹-具有直接操作硬件、访问內存的能力 提供了指针、地址运算等灵活特性,稈序员可以仟意发挥,增加了出锖的几率。所以在追求速度与灵 峾性的冋同时,一定要注意保持程序的健壮性。在増强代码稳定性过桯中,程序员通常采用i-else等防 御式编程,使得代码非常臃肿,可适当采用RAIⅠ、智能指针等技术 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 与语言编程规范的关系 本文在《华为技术有限公司C语言编程规范》(简称C规范)基础上,通过详细阐述如何规避C++语言复杂 性,避免C+-的低级错误,确保有效使用C-+语言特性,代码易于维扩。 C规范里面相同的内容,夲规范不再重复。例如头文伻、变量、表达式、代码编辑与编译、可测试性 安全性、单元测试等章节经过审妉,完全适合C+,本规范不再重复。标识符命名与定义、注祥、排版 与柊式等内容也适合C++,仅仅添加了少量的C+特有的规则和建议,合并成风格一章;涵数章节增加 了內联函数、函数参数等内容;可移植性増加了64位以及C艹+专冇的薮据转换等內容;质量保证也符合 C艹+的需要,将资源分配和释放部分C艹特有的内容编写成单独章节;宏、常量也符合C++,考虑到C++ 普遍使用 cons t,增加了常属性( const)章节。 新増初始化和类型转换,类,作用域、模板与C艹-其他特性,异常与错误处理,并发,全球化等C艹特 有的内容 本规范和C规范有沖突的地方,以本规范为准。 规范实施、解释 本规范制定了编写C+语言程序的基本原则、规则和建议。 木规范适用于公司内使用C++语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改 的代码应遵守本规范 本规范由软件工稈体系发布和维护。实施屮遇到问题,可以到论坛 http://hi3ms.huaweicom/group/1735/threads.htmi上讨论。 在某些情况下需要违反本规范给出的规则时,相关团队必须通过一个正式的沇程来评审、决貪规则违 反的部分,个体程序员不得违反本规范中的相关规则。 术语定义 原则:编程时必须坚持的指导思想 规则:编程时强制必须遵守的约定。 建议:编程时必效加以考虑的约定 说明:对此原则/规则/建议进行必要的解释。 示例:对此原则/规则/建议从好、不好两个方面给出例子。 延伸阅读材料:建议进一步阅读的参考材料。 常量 不变的值更易于理餡、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时侯,应该把 const 作为默认的选项 规则1.1使用 const常量取代宏 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 说明:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显 示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。 示例 defi: e MAX MSISDN LEN(20)//不好的例子 const int MAX MSISDN LEN=20;/好的例子 规则1.2一组相关的整型常量应定义为枚举 说明:之所以使用枚举,基于: ●枚举比# define或 const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从 而避免错误发生。 示例 //好的例子 enum DayofWeek( sunday, monday, tuesday, wednesday, thursday, friday, saturday)i enum Ccloriblack, blue, whiter red, purp_e] BOOL CclorizeCalendar (DayofWeek today, Color todays Color) Coorizeca1 endor(b1ue, sunday);//编译报错,1ue和 Sunday位置错误 //不好的例子: const int sunday=0i const int monday= 1 const int b⊥acK const int blue BOOL CclorizeCalendar (int today, int todays Color Coorizecalendar(blue, sunday);//不会报错 当枚举值需要对应到具体数值时,须在声明时昰示赋值。否则不需要昰式赋值,以避免重复赋值, 降低维护(增加、朋除成员)工作量 示例 好的例子:s协议里定义的设备I值,用于标识设备类型 cnum TDcv-cclypc DEV UNKNOWN --l, DEV DSMP 0 DEV工SMG DEV WAPPORTAL=2 程序内部使用,仅用于分类的情況,不应该进行显式的赋值。 示例 /好的例子:程序中用来标识会话状态的枚举定义 enum TSessionstate SESSION STATE INITI SESSTON STATE CTOSED SESSION STATE WA工TING ●应当尽量避免枚举值亘复,如必须重复也要用己定义的枚举来修饰,例如: typed f enum RTCP SR 200, RTCP MIN TYPE RTCP SR //must be lowest known type RTCP RR 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 RTCP SDES= 202 RTCP BYE 203, RTCP APP 204, RTCP RTPFB=205 RTCP PSEB =206/ RTCP XR 207 RTCP RSI =208 RTCP PUBPCRTS =209 RTCP MAX TYPF= RTCP PUB PORTS //must be highest known type rtcp type ti 规则1.3不相关的常量,即使取值一样,也必须分别定义 说明:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。 示例: /好的例子:协议和协议B,于机号( (MSISDN)的长度都是20。 unsigned const int. A MAX MST SDN LEN 0; unsigned const int B MAX MSI SDN 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函数):不修改任何数据成员的函数:未调用非 cons t函数、未返回数 据成员的非 const指针或引用的函数。 数据成员:如果数据成员在对象构造之后个再发生变化,可将其定义为 cons t。 2初始化和类型转换 声明、定义与初始化 规则2.1禁止用 memcpy、 memset初始化非POD对象 说明:PO全称是“ Plain0 ld Data”,是C++98标准(ISO/IEC14882, first edition,19980901) 中引入的一个概念,POD类型主要包括int,char, float, double, enumeration,woid,指针等原始 类型及其集合类型,不能使用封装和面对对象特性(如用户定义的构造/赋值/析构函数、基类、虚函 数等)。 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 由于非P0D类型比如非集合类型的 class对象,可能存在虚函数,内存布局不确定,跟编译器有关,滥 用内存拷贝可能会导致严重的问题 即使对集合类型的 class,使用直接的内存拷贝和比较,破坏了信息隐蔽和数据保护的作用,也不提倡 memcpy、 memset操作 示例:×××产品程序异常退出( corc dump)。 经过现场环境的模似,程序产生 COREDUMP,其原因是:在初始化函数内使用 memset(this,0, sizeof(*this))进行了类的初始化,将类的虚函数表指针被清空,从而导致使用空指针。 解决方案:使用C艹构造函数初始化,不要便用 memset函数初始化类对象 建议2.1变量使用时才声明并初始化 说明:变量在使用前未赋初值,是常见的低级编程错误。使用前才声明变量并同时初始化,非常方便 地避免了此类低级错误。 在函数开始位置声明所有变量,后面才使用变量,作用域覆盖整个函数实现,容易导致如下问题: 程序难以理解和维护:变量的定义与使用分离 变量难以合理初始化:在函数丌始时,经常没有足够的笮息进行变量初始化,往往用某个默认的 空值(比如零)来初始化,这遥常是一种浪费,如果变量在被赋于有效值以前使用,还会导致错误。 遵循变量作用域最小化原则与魷近声明原则,使得代码更容易阅读,方便了解变量的类型和初始值 特别是,应使用初始化的方式替代声明再赋值 示例: 不好的例子:声明与初始化分离 string name;//声明时未初始化:调用缺省构造函数 nane=" zhangsan";//再次调用赋值操作符函数;声明与定义在不同的地方,理解相对困难 好的例子:声明与初始化一体,理解相对容易 string name(" zhangsan");//调用一次构造函数 建议2.2避免构造函数做复杂的初始化,可以使用“init”函数 说明:正如函数的变量都在函数内部初始化一样,类数据成员最好的初始化场所就是构造函数,数据 成员都应该尽量在构造函数中初始化 以下情况可以使用init(函数来初始化: 需要提供初始化返回信息。 数据成员初始化可能抛异常。 ●数据成员初始化大败会造成该类对象初始化失败,引起不确定状态 数据成员初始化依赖this揞针:构造凶数没结束,对象就没有构造出来,构造凶数內不能使用this 成员 数据成员初始化需要调用虚函数。在构造函数和析构函数中调用虚函数,会导致未定乂的行为 示例:数据成员初始化可能拋异常: cl ass CPPRule 华为机密,未经许可不得扩散第页共页 se 语言编程规范 内部公开 public CEPRule(): size (0), res (null)i //仅进行值初始化 long init (int size) //根据传入的参数初始化size,分配资源res r vate int si Resourceptrx res //使用方法 CPPRule a it(100) 建议2.3初始化列表要严格按照成员声明顺序来初始化它们 说明:编译器会按照数据成员在类定义中声明的顺序进行初始化,而不是按照初始化列表中的顺序, 如果打乱初始化列表的顺序实际上不起作用,但会造成阅读和理解上的混淆;特别是成员变量之间存 在依赖关系时可能导致BUG 示例: //不好的例子:初始化顺序与声明顺序不一致 class Emp-oyee public: Employee(const charx firstName, const charx lastName firstName (firstName), lastName (lastName) r email (firstName.+-astName t huawei. com)i pr-vate: string email, firstName lastName 类定义emai1是在 firstName, lastName之前声明,它将首先初始化,但使用了未初始化的 ratNam和 lastName,导致错误。 在成员声明时,应按照成员相互依赖关系按顺序声明。 建议2.4明确有外部依赖关系的全局与静态对象的初始化顺序 说明:如果全尻对象A的成员变量有外部依赖,比如依赖另外一个全局变量B,在A的构造函数中访问B, 隐含的规则就是B先于A初始化,然而全局与静态对象的初始化与析构顺序未有严格定义,无法确保B 已经完成初始化,而每次生成可执行程序都可能发生变化,这类BUG难以定位。 通常采用单件( Singleton)模式或者把有依赖关系的全局对象放在一个文件中定义来明确初始化顺序 冋一个文件屮,若全局对象a在全局对象b之前定义,则a一定会在b之前初始化;但是不同文件中的全 局对象就没有固定的初始化顺序。可以在main0或 pthread once(内初始化一个运行期间不回收的 指针 类型转换 避免使用类型分支来定制行为:类型分支来定制行为容易出错,是企图用C+编写C代码的明显标志。 这是一种很不灵活的技术,要添加新类型时,如果忘记修改所有分支,编译器也不会告知。使用模板 和虚函数,让类型自己而不是调用它们的代码来决定行为。 华为机密,未经许可不得扩散第页共页

...展开详情
试读 57P 华为C++语言编程规范
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
chy_ai_ni 很详细,值得借鉴,非常好! 谢谢了!
2019-11-02
回复
小唐老师^_^ 可以很好不错
2019-07-17
回复
gg-123 内容很全,自己清晰,格式整齐
2018-09-11
回复
yangna1014 一般般,不是很全
2018-02-01
回复
yajundaisy1213 资源很好,规范,实用
2017-11-13
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
华为C++语言编程规范 39积分/C币 立即下载
1/57
华为C++语言编程规范第1页
华为C++语言编程规范第2页
华为C++语言编程规范第3页
华为C++语言编程规范第4页
华为C++语言编程规范第5页
华为C++语言编程规范第6页
华为C++语言编程规范第7页
华为C++语言编程规范第8页
华为C++语言编程规范第9页
华为C++语言编程规范第10页
华为C++语言编程规范第11页
华为C++语言编程规范第12页

试读结束, 可继续读6页

39积分/C币 立即下载