华为技术有限公司c语言编程规范

所需积分/C币:22 2018-10-13 11:53:11 93.48MB PDF

编程规范,使得项目编码风格统一。 在公司的开发中,我们要明白程序不是写给自己看的,也不是所有的代码都是自己写的,我们不仅需要看别人的代码而且还要把自己的代码交给别人看,团队看。也许还会在你离职以后交给你的接班人看。而且,就算是你写的程序,如果过了很久你再去看的话(相信也会受到一万点真实伤害,脱口而出”这是哪个家伙写的这是什么东西!!!”)所以,程序文档的书写,注释的书写,以及标准的编码规范就非常的重要。(而这些是每一个大学老师都不会交给你的)
密级: confidentiality leve HUAWEL DKBA2826-2011.5 目录 Table of contents 0规范制订说明 0.1前言 02代码总体原则 0.3规范实施、解释 04术语定义 555666 1头文件 2函数 12 3标识符命名与定义 21 3.1通用命名规则 21 32文件命名规则 23 33变量命名规则 23 34函数命名规贝 24 3.5宏的命名规则 24 4变量 25 28 6质量保证 32 7程序效率 36 8注释 9排版与格式 10表达式 11代码编辑、编译 12可测性 50 13安全性 51 13.1字符串操作安全 51 132整数安全 52 133恪式化输出安全 134文件O安全… 57 135其它 14单元测试 59 15可移植性 60 16业界编程规范 60 2011-06-02 华为机密,未终许可不得护散 Huawei confidential第3页,共61页Page3,Tota|61 密级: confidentiality leve HUAWEL DKBA2826-2011.5 C语言编程规范 范围: 本规范适用于公司内使用C语言编码的所有软件。本规范自发布之日起生效,以后新编写的和修改的 代码应遵守木规范 简介 本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简沽、可测试、安全、程序效 率、可移植各个方面对C语言编程作出了具体指导。 2011-06-02 华为机密,未经许可不得扩散 Huawei confidential第4页,共61页Page4,Tota6 密级: confidentiality leve HUAWEL DKBA2826-2011.5 0规范制订说明 01前言 为提高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可测试、高效、可移植的 代码,编程规范修订工作组分析、总结了我司的各种典型编码问颙,并参考了业界编程规范近年米的 成果,重新对我司1999年版编程规范进行了梳理、伉化、刷新,编写了本规范。 本规范将分为完整版和精简版,完整版将包括更多的样例、规范的解释以及参考材料(what&wy) 而精简版将只包含规则部分(what)以便查阅。 在木规范的最后,列出了一些业界比较优秀的编程规范,作为延伸阅读参考材料。 02代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文 章一样发声朗诵出来 目前软件维护期成本占整个生命周期成本的10%90%。根据业界经验,维护期变更代码的成本,小犁系 统是开发期的5倍,大型系统(100万行代码以上)可以达到100倍。业界的调查指出,开发组半均大约 半的人力用于弥补过去的错误,而不是添加新的功能米帮助公司提高竞争力 “程序必须为阅读它的人而编写,只是顺便用于机器执行。”— -Harold abe l son和 Gerald jay Sussman “编写程序应该以人为木,计算第二。 Steve Mcconnell 本规范通过后文中的原则(如头优秀的代码可以自我解释,不通过注释即可轻易读懂/头文件中适合放 置接口的声明,不适合放置实现/除了常见的通用缩写以外,不使用单词缩写,不得使用汉语拼音)、 规则(如防止局部变量与全局变量同名)等说明清晰的重要性。 般情况下,代码的可阅读性高于性能,只有确定性能是瓶颈时,才应该主动优化 、简洁为美 简洁就是易于理解并且易于实现。代码越长越难以看懂,也就越容易在修改时引入错误。写的代码越 多,意味着出错的地方越多,也就意味着代码的可靠性越低。因此,我们提倡大家通过编写简浩明了 的代码来提升代码可靠性。 废弁的代码(没有被调用的函数和全局变量)要及时清除,重复代码应该尽可能提炼成函数。 本规范通过后文中的原则(如文件应当职责单一/一个函数仅完成一件功能)、规则(重复代码应该尽 可能提炼成函数/避免函数过长,新增函数不超过50行)等说明简洁的重要性。 3、选择合适的风格,与代码原有风格保持一致 产品所有人共同分享同一种风格所带来的好处,远远超出为了统一而付出的代价。在公司已有编码规 范的指导下,审慎地编排代码以使代码尽可能清晰,是一顷项艹常重要的技能。如果重构/修改其他风格 的代码时,比较明智的做法是根据现有代码的现有风格继续编写代码,或者使用烙式转换工具进行转 2011-06-02 华为机密,未经许可不得扩散 Huawei confidential第5页,共61页Page5,Tota6 密级: confidentiality leve HUAWEL DKBA2826-2011.5 换成公司内部风格。 0.3规范实施、解释 本规氾制定了编写C语言程序的基本原则、规则和建议 本规范适用于公司内使用C语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改 的代码应遵守本规范。 本规范由质量体系发布和维护。实施中遇到问题,可以到论坛 http://hi3ms.huaweicom/group/1735/thrcads.html上讨论。 在某些情氿下(如BSP软件)需要违反本文档给出的规则时,相关团队必须通过一个正式的流程来讠 审、决策规则违反的部分,个体程序员不得违反本规范中的相关规则。 04术语定义 原则:编程时必须坚持的指导思想。 规则:编程时强制必须遵守的约定 建议:编程时必须加以考虑的约定 说明:对此原则/规则/建议进行必耍的解释。 示例:对此原则/规则/建议从正、反两个方面给出例子 延伸阅读材料:建议进一步阅读的参考材料。 1头文件 背景 对于C语言来说人头文住的设计体现了大部分的系统设计。不合理的头文件布局是编译时间过长的根 因,不合理的头文件实际上不合理的设计 术语定义 依赖:木章节特指编译依赖。若ⅹ.h包含了y.h,则称作x依赖y。依赖关系会进行传导,如x.h包含y.h, 而y.h又包含了z.h,则x通过y依赖了z。依赖将导致编译时间的上升。虽然依赖是不可避免的,也是必 须的,但是不良的设计会导致整个系统的依赖关系无比复杂,使得任意一个文件的修改都要重新编译 整个系统,导致编译时间巨幅上升。 在一个设计良好的系统中,修改一个文件,只需要重新编译数个,甚至是一个文件。 某产品曾经做过一个实验,把所有函数的实现通过工具注释掉,其编译时间只减少了不到10%,究其原 因,在于A包含B,B包含C,C包含D,最终几乎每一个源文件都包含了项目组所有的头文件,从而导致 绝大部分编译时间都花在解析头文件上。 某产品更有一个“优秀实践”,用于将.c文件運过⊥具合并成一个比较大的.c文件,从而大幅度提高 编译效率ε其根本原因还是在于通过合并.c文件减少了头文件解析次数。但是,这样的“优秀实践” 是对合理划分,c文件的一种破坏。 大部分产品修改一处代码,都得需要编译整个工程,对于TD之类的实践,要求对于模块级別的编译时 间控制在秒级,即使使用分布式编译也难以实现,最终仍然需要合理的划分头文件、以及头文件之间 的包含关系,从根本上降低编译时间 2011-06-02 华为机密,未经许可不得扩散 Huawei confidential第6页,共61页Page6,Tota6 密级: confidentiality leve DKBA2826-2011.5 google c++ Style guido》1.2头文件依赖章节也纶出了类似的阐述: 若包含了头文件a.h,则就引入了新的依赖:一旦a.h被修改,任何直接和间接包含aa.h代码都会被 重新编译。如果aa.h又包含了其他头文件如b.h,那么bh.h任何改变都将导致所有包含了ah代 码被重新编译,在敏捷开发方式下,代码会被频繁构建,漫长的编译时间将极大的阻碍频繁构建。囚 此,我们倾向于减少包含头文件,尤其是在头文件中包含头文件,以控制改动代码后的编译时间 合理的头文件划分体现了系统设计的思想,但是从编程规范的角度看,然有些通用的方法,用来 合理规划头文件。本章节介绍的一些方法,对于合理规划头文件会有一定的帮助。 原则1.1头文件中适合放置接口的声明,不适合放置实现 说明:头文件是模块( Modulo)或单元(Unit)的对外接口。头文件中应放置对外部的声明,如对外 提供的凼数声明、宏定义、类型定义等。 内部使用的函数(相当于类的私有方法)声明不应放在头文件中。 内部使用的宏、枚举、结构定义不应放入头文件中。 交量定义不应放在头文件中,应放在.c文件中 变量的声明尽量不要放在头文件中亦即尽量不要使用全局变量作为接口。变量是模块或单元的内韶 实现细节,不应通过在头文件中声明的方式直接暴露给外部,应通过函数接口的方式进行对外暴露。即 使必须使用全局变量,也只应当在.c中定义全局变量,在.h中仅声明变量为全局的 延伸阅读材料:《C浯言接口与实现》( David r. Harson著傅蓉周鹏张昆琪权威译机械工ν出 版社2004年1月)(英文版:" C Interfaces and Implementations") 原则1.2头文件应当职责单一。 说明:头文件过于复杂,依赖过于复杂是导致编译时间过长的要原因。很多现有代码中头文件过大 职责过多,再加上循环依赅的问题,可能导致为了在.c中使用一个宏,而包含十几个头文件。 示例:如下是某平台定义WORD类型的头文件: #includc (vXWorKS. h> 世 include< KERNELL⊥B.山> #include (sEMlIB. h> #include (MSGQLIB.h> include STDARG.H> #include (FtoliB. h> #include <sTDIo.h> #include <sTDLIB. h> #include (CTYPe. h> include stRING. h> #include (ErrnolIB. h> #include (TIMERS. h> +include MEMLIB. h> #include (TIMe. h #include <WDLIB. H> tinc lude <sYSLIB. h> include <TAsKHOOKLIB. include (REBOoT IB. h> 2011-06-02 华为机密,未经许可不得扩散 Huawei confidentia第7页,共61页Page7,Tota6 密级: confidentiality leve HUAWEL DKBA2826-2011.5 t ypedef unsigned short. WORD 这个头文件不但定义了基本数据类型WORD,还包含了 stdio. h aslib.h等等不常用的头文件。如果工 程中有10000个源文件,而其中100个源文件使用了 stdio.h的 printf,由于上述头文件的职责过于庞大, 而WORD又是每一个文件必须包含的,从而导致 stdio.h/ syslib.h等可能被不必要的展开了9900次,大 大增加∫工程的编译时间。 原则1.3头文件应向稳定的方向包含。 说明:头文件的包含关系是一种依赖,一般来说,应当让不稳定的模块依赖稳定的模块,从而当不稳 定的模块发生变化时,不会影响(编译)稳定的模块。 就我们的产品来说,依赖的方向应该是:产品依赖于平台,平台依赖于标准库。某产品线半台的代码 中已经包含了产品的头文件,导致平台无法单独编译、发布和测试,是一个非常糟糕的反例。 除了不稳定的模块依赖于稳定的模块外,更好的方式是两个模块共同依赖于接口,这样任何一个模块 的内部实现更改都不需要重新编译另外一个模块。在这里,我们假设接口本身是最稳定的。 延伸阅读材料:编者推荐开发人员使用“依赖倒置”原则,即山使用者制定接口,服务提供者实现接口, 更具体的描述可以参见《敏捷软件开发:原则、模式与实践》( Robert o. Martin著邓辉详清 华大学出版社2003年9月)的第二部分“敏捷设计”章节。 规则1.1每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口 说明:如果一个.c文件不需要对外公布任何接口,则其就不应当存在,除非它是程序的入口,如main 函数所在的文件 现有某些产品中,习惯一个.c文件对应两个头文件,一个用于存放对外公开的接口,一个用于存放内 部需要用到的定义、声明等,以控制.c文件的代码行数。编者不提倡这种风格。这种风格的根溟在于 源文件过大,应首先考虑拆分.c文件,使之不至于太大。另外,一且把私有定义、声明放到独立的头 文件中,就无法从技术上避免别人 include之,难以保沚这些定义最后真的只是私有的。 本规则反过来并不一定成。有些特別简单的头文件,如命令ID定义头文件,不需要有对应的.c存在。 小例:对于如下场景,如在一个.c中存在函数调用关系: void foo o bar o void baro Do some thing 必须在foo之前声明bar,否则会导致编译错误。 这一类的函数声明,应当在.c头部声明,并声明为 statIc的,如下: static void bar( void foo( bar 2011-06-02 华为机密,未经许可不得扩散 Huawei confidential第8页,共61页Page8:Tota6 密级: confidentiality leve HUAWEL DKBA2826-2011.5 void bar o Do something 规则1.2禁止头文件循环依赖 说明:头文件循环依赖,指a.h包含b.h,b.h包含C.h,c.h包含a.h之类导致任何一个头文件修改,都 导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。而如果是单向依赖,如a.h包含b.h,b.h包含 c.h,而c.h不包含任何头文件,则修改a.h不会导致包含了b.h/.h的源代码重新编译 规则1.3.c/.h文件禁止包含用不到的头文件。 说明:很多系统中头文件包含关系复杂,开发人员为了省事起见,可能不会去一一钻研,直接包含 切想到的头文件,甚至有些产品十脆发布了一个god.h,其中包含了所有头文件,然后发布给各个项目 组使用,这种只图一时省事的做法,导致整个系统的编译时间进一步恶化,并对后来人的维护造成了 口大的麻烦。 规则1.4头文件应当自包含 说明:简单的说,自包含就是任意一个头文件均可独立编译。如果一个文件包含某个头文件,还要包 含另外一个头文件才能工作的话,就会增加交流璋碍,给这个头文件的用户增添不必要的负担。 小例 如果a.h不是自包含的,需要包含b.h才能编译,会带来的危害 每个使用a.h头文件的.c文件,为了让引入的a.h的内容编译通过,都要包含额外的头文件b.h 额外的头文件b.h必须在a.h之前进行包含,这在包含顺序上产生了依赖。 注意:该规则需要与“.c/.h文件禁止包含用不到的头文件”规则一起使用,不能为了让a.h自包含, 而在a.h中包含不必要的头文件。a.h要刚刚可以自包含,不能在a.h中多包含任何满足白包含之外的其 他头文件 规则1.5总是编写内部# include保护符(# define保护)。 说明:多次包含一个头文件可以通过认真的设计来避免。如果不能做到这一点,就需要采取阻止头文 件内容被包含多于一次的机制。 通常的手段是为每个文件配置一个宏,当头文件第一次被包含时就定义这个宏,并在头文件被再次包 含时使用它以排除文件内容。 所有头文件都应当使用* define防止头文件被多重包含,命名格式为 FILENAⅦEH,为了保让唯一性, 更好的命名是 PROJECTNAME PATH FILENAME H 注:没有在宏最前面加上",即使用 FILENAME H代替 FILENAME H,是囚为一般以”"和”“开头的 标识符为系统保留或者标准库使用,在有些静态检査工具中,若全局可见的标识符以"开头会给出告 定义包含保护符时,应该遵守如下规则: 1)保护符使用唯一名称: 2)不要在受保护部分的前后放置代码或者注释。 2011-06-02 华为机密,未经许可不得扩散 Huawei confidential第9页,共61页Page9,Tota6 密级: confidentiality leve HUAWEL DKBA2826-2011.5 示例:假定ⅤOsS工程的 timer模块的 timer.h,其目录为VOs/ include/ timer/ timer.h,应按如下方式保护 世 ifndef vos nclude t⊥ MER TIMER tdefine vos Include timertimer h #endif 也叫以使用如下简单方式保护: #ifndef TIMer H +define timer h tendif 例外情况:头文件的版权声明部分以及头文件的整体注释部分(如阐述此头文件的开发背景、使用注 意事项等)可以放在保护符(# indef Xx h)前面。 规则1.6禁止在头文件中定义变量。 说明:在头文件中定义变量,将会由于头文件被其他,c文件包含而导致变量重复定义。 规则1.7只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过 extern的方式使用外部 函数接口、变量 说明:若ac使用了b.c定义的foo函数,则应当在b.h中声明 extern int foo( int input);并在a.c 中通过# include<b.h>来使用foo。禁止通过在a,c中直接写 extern int foo( int input):来使用foo, 后面这种写法容易在foo改变吋可能导致声明和定义不一致。 规则1.8禁止在 extern"c"中包含头文件。 说明:在 extern"C"中包含头文件,会导致 extern"C"嵌套, Visual studio对 extern"C"嵌套层次有 限制,嵌套层次太多会编译眚误。 在 extern"℃"中包含头文件,可能会导致被包含头文件的原有意图遭到破坏。例如,存在a.h和b.h两 个头文件 #ifndef A H ifndef b h #define a h +define b h cplusplus #ifdef cplusplus void foo(int) #define a (value) foo (value) fendi #else vold a(in t) #include a h void bo #endif /*AH* #ifdef cplusplus #endif #endif /*Bh* 使用C++预处理器展开b.h,将会得到 2011-0602 华为机密,未经许可不得扩散 Huawei confidential第10页,共61页Page10,Tota61

...展开详情

评论 下载该资源后可以进行评论 2

Liigo 规范编号是:DKBA 2826-2011.5。还有没有更新版本?
2019-11-28
回复
samcsu002 清晰,但是带标注的,格式很大。
2019-08-30
回复
img
chenze2017

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐