ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:19.77KB ,
资源ID:23941104      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23941104.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(华为软件编程规范.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

华为软件编程规范.docx

1、华为软件编程规范华为软件编程规范总体原则清晰,易于维护、易于重构简洁,易于理解,并且易于实现风格统一,代码整体风格保持统一通用性,遵循业界通用的编程规范目录结构建议将工程按照功能模块划分子目录(可参考LiteOS的功能模块划分),子目录再定义头文件和源文件目录。命名使用驼峰风格进行命名,此风格大小写字母混用,不同单词间通过单词首字母大写来分开,具体规则如下:类型命名风格形式函数,自定义的类型大驼峰,或带有模块前缀的大驼峰AaaBbb,XXX_AaaBbb局部变量,函数参数,宏参数,结构体成员,联合体成员小驼峰aaaBbb全局变量带g_前缀的小驼峰g_aaaBbb宏,枚举值全大写并下划线分割AA

2、A_BBB内核头文件中防止重复包含的宏变量带_LOS前缀和H后缀,中间为大写模块名,以下划线分割_LOS_MODULE_H全局函数、全局变量、宏、类型名、枚举名的命名,应当准确描述并全局唯一在能够准确表达含义的前提下,局部变量,或结构体、联合体的成员变量,其命名应尽可能简短LiteOS的对外API使用LOS_Module_Func的方式,如果有宾语采用前置的方式,比如:1.LOS_TaskCreate2.LOS_SwtmrStart3.LOS_SemPendkernel目录下内部模块间接口使用OsModuleFunc的方式,比如:1.OsTaskScan2.OsSwtmrStartarch目录

3、需要给上层模块提供LowLevel接口,这部分接口采用ArchModuleFunc的方式。其他情况可采用ModuleFunc的方式。排版与格式程序块采用缩进风格编写,使用空格而不是制表符(t)进行缩进,每级缩进为4个空格采用K&R风格作为大括号换行风格,即函数左大括号另起一行放行首,并独占一行,其他左大括号跟随语句放行末,右大括号独占一行,除非后面跟着同一语句的剩余部分,如if语句的else/elseif或者分号,比如:1.structMyType/左大括号跟随语句放行末,前置1个空格2.3.;/右大括号后面紧跟分号1.intFoo(inta)2./函数左大括号独占一行,放行首3.if(a0)

4、/左大括号跟随语句放行末,前置1个空格4.5.else/右大括号、else、以及后续的左大括号均在同一行6.7./右大括号独占一行8.9.条件、循环语句使用大括号,比如:1.if(objectIsNotExist)/单行条件语句也加大括号2.returnCreateNewObject();3.1.while(condition)/即使循环体是空,也应使用大括号1.while(condition)2.continue;/continue表示空逻辑,使用大括号3.case/default语句相对switch缩进一层,缩进风格如下:1.switch(var)2.case0:/缩进一层3.DoSome

5、thing1();/缩进一层4.break;5.case1:6.DoSomething2();7.break;8.default:9.break;10.一行只写一条语句一条语句不能过长,建议不超过120个字符,如不能缩短语句则需要分行写换行时将操作符留在行末,新行进行同类对齐或缩进一层,比如:1./假设下面第一行不满足行宽要求2.if(currentValueMIN&/换行后,布尔操作符放在行末3.currentValueMAX)/与(&)操作符的两个操作数同类对齐4.DoSomething();5.6.1./假设下面的函数调用不满足行宽要求,需要换行2.ReturnTyperesult=Fu

6、nctionName(paramName1,3.paramName2,4.paramName3);/保持与上方参数对齐1.ReturnTyperesult=VeryVeryVeryLongFunctionName(/写入第1个参数后导致过长,直接换行2.paramName1,paramName2,paramName3);/换行后,4空格缩进一层1./每行的参数代表一组相关性较强的数据结构,放在一行便于理解,此时可理解性优先于格式排版要求2.intresult=DealWithStructLikeParams(left.x,left.y,/表示一组相关参数3.right.x,right.y);/

7、表示另外一组相关参数声明定义函数时,函数的返回类型以及其他修饰符,与函数名同行指针类型*应该靠右跟随变量或者函数名,比如:1.int*p1;/Good:右跟随变量,和左边的类型隔了1个空格2.int*p2;/Bad:左跟随类型3.int*p3;/Bad:两边都没空格4.int*p4;/Bad:两边都有空格当*与变量或函数名之间有其他修饰符,无法跟随时,此时也不要跟随修饰符,比如:1.char*constVERSION=V100;/Good:当有const修饰符时,*两边都有空格2.intFoo(constchar*restrictp);/Good:当有restrict修饰符时,*两边都有空格根

8、据上下内容的相关程度,合理安排空行,但不要使用连续3个或更多空行编译预处理的#统一放在行首,无需缩进。嵌套编译预处理语句时,#可以进行缩进,比如:1.#ifdefined(_x86_64_)&defined(_GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)/位于行首,不缩进2.#defineATOMIC_X86_HAS_CMPXCHG16B1/缩进一层,区分层次,便于阅读3.#else4.#defineATOMIC_X86_HAS_CMPXCHG16B05.#endif注释注释的内容要清楚、明了,含义准确,防止注释二义性在代码的功能、意图层次上进行注释,即注释解释代码难以

9、直接表达的意图,而不是仅仅重复描述代码函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明避免在注释中使用缩写,除非是业界通用或子系统内标准化的缩写文件头部要进行注释,建议注释列出:版权说明、版本号、生成日期、作者姓名、功能说明、与其它文件的关系、修改日志等注释风格要统一,建议优先选择/*/的方式,注释符与注释内容之间要有1空格,单行、多行注释风格如下:1./*单行注释*/1./*2.*多行注释3.*第二行4.*

10、/注释应放在其代码上方或右方上方的注释,与代码行之间无空行,保持与代码一样的缩进。右边的注释,与代码之间至少相隔1个空格。如果有多条右置注释,上下对齐会更加美观,比如:1.#defineA_CONST100/此处两行注释属于同类2.#defineANOTHER_CONST200/可保持左侧对齐宏代码片段使用宏隔离时,统一通过#ifdef的方式,例如:1.#ifdefLOSCFG_XXX2.3.#endif定义宏时,要使用完备的括号,比如:1.#defineSUM(a,b)a+b/不符合本条要求2.#defineSUM(a,b)(a)+(b)/符合本条要求但是也要避免滥用括号,比如单独的数字或标

11、识符加括号毫无意义:1.#defineSOME_CONST100/单独的数字无需括号2.#defineANOTHER_CONST(-1)/负数需要使用括号3.#defineTHE_CONSTSOME_CONST/单独的标识符无需括号包含多条语句的函数式宏的实现语句必须放在do-while(0)中,例如:1.#defineFOO(x)do2.(void)printf(argis%dn,(x);3.DoSomething(x);4.while(0)禁止宏调用参数中出现预编译指令宏定义不以分号结尾头文件设计原则头文件应当职责单一一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名;如

12、果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名建议每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口头文件中适合放置接口的声明,不适合放置实现不要在头文件中定义变量禁止头文件循环依赖,循环依赖指a.h包含b.h,b.h包含c.h,c.h包含a.h头文件应当自包含,即任意一个头文件均可独立编译,但同时也要避免包含用不到的头文件头文件必须用#dene保护,防止重复包含,比如内核中统一使用以下宏定义保护:禁止通过声明的方式引用外部函数接口、变量,只能通过包含头文件的方式使用其他模块或文件提供的接口禁止在externC中包含头文件按照合理的顺序包含头文件:

13、o源文件对应的头文件oC标准库o需要包含的OS其他头文件版权声明头文件版权声明一致,放在头文件置顶位置如果提交的代码是在开源软件基础上修改所编写或衍生的代码,请遵循开源许可协议要求,并且已履行被修改软件的许可证义务数据类型基础类型定义统一使用los_typedef.h中定义的类型,比如定义无符号32位整型变量使用UINT32变量一个变量只有一个功能,不要把一个变量用作多种用途防止局部变量与全局变量同名不用或者少用全局变量定义函数的局部变量时,控制变量的占用空间,避免因占用过多栈空间导致程序运行失败。比如需要一个大数组,可以通过动态分配内存的方式来避免栈空间占用过大在首次使用前初始化变量指向资源

14、句柄或描述符的变量,在资源释放后立即赋予新值,包括指针、socket描述符、文件描述符以及其它指向资源的变量禁止将局部变量的地址返回到其作用域以外,下面是一个错误示例:1.int*Func(void)2.3.intlocalVar=0;4.5.return&localVar;/错误6.7.8.voidCaller(void)9.10.int*p=Func();11.12.intx=*p;/程序产生未定义行为13.正确代码示例:1.intFunc(void)2.3.intlocalVar=0;4.5.returnlocalVar;6.7.8.voidCaller(void)9.10.intx=F

15、unc();11.12.如果要使用其他模块的变量,应尽量避免直接对变量进行访问,而是通过统一的函数封装或者宏封装的方式,比如mutex模块中:1./私有头文件中引入全局变量,但要避免直接使用2.externLosMuxCB*g_allMux;3./通过GET_MUX的方式对g_allMux进行访问4.#defineGET_MUX(muxID)(LosMuxCB*)g_allMux)+GET_MUX_INDEX(muxID)函数重复代码应该尽可能提炼成函数避免函数过长,新增函数不超过40-50行内联函数要尽可能短,避免超过10行(非空非注释)避免函数的代码块嵌套过深函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用可移植性不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。业界编程规范C语言编程规范参考资料较多,大家可以自行了解,本文不再过多赘述。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1