华为软件编程规范
总体原则
清晰,易于维护、易于重构
简洁,易于理解,并且易于实现
风格统一,代码整体风格保持统一
通用性,遵循业界通用的编程规范
目录结构
建议将工程按照功能模块划分子目录(可参考LiteOS的功能模块划分),子目录再定义头文件和源文件目录。
命名
使用驼峰风格进行命名,此风格大小写字母混用,不同单词间通过单词首字母大写来分开,
具体规则如下:
类型
命名风格
形式
函数,自定义的类型
大驼峰,或带有模块前缀的大驼峰
AaaBbb,XXX_AaaBbb
局部变量,函数参数,宏参数,结构体成员,联合体成员
小驼峰
aaaBbb
全局变量
带'g_'前缀的小驼峰
g_aaaBbb
宏,枚举值
全大写并下划线分割
AAA_BBB
内核头文件中防止重复包含的宏变量
带'_LOS'前缀和'H'后缀,中间为大写模块名,以下划线分割
_LOS_MODULE_H
全局函数、全局变量、宏、类型名、枚举名的命名,应当准确描述并全局唯一
在能够准确表达含义的前提下,局部变量,或结构体、联合体的成员变量,其命名应尽可能简短
LiteOS的对外API使用LOS_Module_Func的方式,如果有宾语采用前置的方式,比如:
1.LOS_TaskCreate
2.LOS_SwtmrStart
3.LOS_SemPend
 kernel目录下内部模块间接口使用OsModuleFunc的方式,比如:
1.OsTaskScan
2.OsSwtmrStart
arch目录需要给上层模块提供LowLevel接口,这部分接口采用ArchModuleFunc的方式。其
他情况可采用ModuleFunc的方式。
排版与格式
程序块采用缩进风格编写,使用空格而不是制表符('\t')进行缩进,每级缩进为4个空格
采用K&R风格作为大括号换行风格,即函数左大括号另起一行放行首,并独占一行,其他左大括号跟随语句放行末,右大括号独占一行,除非后面跟着同一语句的剩余部分,如if语句的else/elseif或者分号,比如:
1.structMyType{//左大括号跟随语句放行末,前置1个空格
2....
3.};//右大括号后面紧跟分号
1.intFoo(inta)
2.{//函数左大括号独占一行,放行首
3.if(a>0){//左大括号跟随语句放行末,前置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.DoSomething1();//缩进一层
4.break;
5.case1:
printf输出格式 同行6.DoSomething2();
7.break;
8.default:
9.break;
10.}
一行只写一条语句
一条语句不能过长,建议不超过120个字符,如不能缩短语句则需要分行写
换行时将操作符留在行末,新行进行同类对齐或缩进一层,比如:
1.//假设下面第一行不满足行宽要求
2.if(currentValue>MIN&&//换行后,布尔操作符放在行末
3.currentValue<MAX){//与(&&)操作符的两个操作数同类对齐
4.DoSomething();
5....
6.}
1.//假设下面的函数调用不满足行宽要求,需要换行
2.ReturnTyperesult=FunctionName(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);//表示另外一组相关参数
声明定义函数时,函数的返回类型以及其他修饰符,与函数名同行
指针类型"*"应该靠右跟随变量或者函数名,比如:
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修饰符时,"*"两边都有空格
根据上下内容的相关程度,合理安排空行,但不要使用连续3个或更多空行
编译预处理的"#"统一放在行首,无需缩进。嵌套编译预处理语句时,"#"可以进行缩进,比如:
1.#ifdefined(__x86_64__)&&defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)//位于行首,不缩进
2.#defineATOMIC_X86_HAS_CMPXCHG16B1//缩进一层,区分层次,便于阅读
3.#else
4.#defineATOMIC_X86_HAS_CMPXCHG16B0
5.#endif
注释
注释的内容要清楚、明了,含义准确,防止注释二义性
在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是仅仅重复描述代码
函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的
要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。