华为代码规范.docx

上传人:b****4 文档编号:6745712 上传时间:2023-05-10 格式:DOCX 页数:61 大小:55.62KB
下载 相关 举报
华为代码规范.docx_第1页
第1页 / 共61页
华为代码规范.docx_第2页
第2页 / 共61页
华为代码规范.docx_第3页
第3页 / 共61页
华为代码规范.docx_第4页
第4页 / 共61页
华为代码规范.docx_第5页
第5页 / 共61页
华为代码规范.docx_第6页
第6页 / 共61页
华为代码规范.docx_第7页
第7页 / 共61页
华为代码规范.docx_第8页
第8页 / 共61页
华为代码规范.docx_第9页
第9页 / 共61页
华为代码规范.docx_第10页
第10页 / 共61页
华为代码规范.docx_第11页
第11页 / 共61页
华为代码规范.docx_第12页
第12页 / 共61页
华为代码规范.docx_第13页
第13页 / 共61页
华为代码规范.docx_第14页
第14页 / 共61页
华为代码规范.docx_第15页
第15页 / 共61页
华为代码规范.docx_第16页
第16页 / 共61页
华为代码规范.docx_第17页
第17页 / 共61页
华为代码规范.docx_第18页
第18页 / 共61页
华为代码规范.docx_第19页
第19页 / 共61页
华为代码规范.docx_第20页
第20页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

华为代码规范.docx

《华为代码规范.docx》由会员分享,可在线阅读,更多相关《华为代码规范.docx(61页珍藏版)》请在冰点文库上搜索。

华为代码规范.docx

华为代码规范

 

华为代码规范

 

目录

1概述5

1.1编写目的5

1.2文档约定5

1.3预期的读者和阅读建议5

1.4参考文献5

2排版要求5

2.1程序块缩进5

2.2程序块之间空行5

2.3长语句和长表达式6

2.4循环、判断等长表达式或语句7

2.5长参数7

2.6短语句8

2.7条件、循环语句8

2.8语句对齐8

2.9函数、过程和结构等语句块9

2.10程序块分界符9

2.11操作符前后空格10

2.12其他11

3注释11

3.1有效注释量11

3.2公司标识11

3.3说明性文件12

3.4源文件头13

3.5函数头部说明13

3.6注释与代码一致14

3.7注释内容14

3.8注释缩写14

3.9注释位置14

3.10变量、常量注释15

3.11数据结构的注释15

3.12全局变量16

3.13注释缩排16

3.14注释与代码之间空行17

3.15变量定义、分支语句17

3.16其他19

4标识符命名20

4.1命名清晰20

4.2特殊命名需注释21

4.3命名风格保持一致21

4.4变量命名21

4.5命名规范与系统风格一致21

4.6其他22

5可读性23

5.1运算符优先级23

5.2避免直接使用数字作为标识符23

5.3其他24

6变量、结构25

6.1公共变量25

6.2公共变量说明25

6.3公共变量访问说明25

6.4公共变量赋值26

6.5防止局部变量与公共变量同名。

26

6.6严禁使用未经初始化的变量作为右值。

26

6.7其他26

7函数、过程34

7.1对所调用函数的错误返回码要仔细、全面地处理。

34

7.2明确函数功能,精确(而不是近似)地实现函数设计。

34

7.3局部变量34

7.4全局变量34

7.5接口函数参数35

7.6其他35

8可测性44

8.1调测开关44

8.2打印信息45

8.3单元测试45

8.4集成测试45

8.5断言使用45

8.6设置与取消有关测试手段时,不能影响软件功能功能48

8.7版本维护48

8.8其他48

9程序效率50

9.1编程时要经常注意代码的效率。

50

9.2提高代码效率50

9.3全局效率高于局部效率51

9.4提高代码空间效率51

9.5循环体内工作量最小化52

9.6其他53

10质量保证56

10.1在软件设计过程中构筑软件质量。

56

10.2代码质量保证优先原则56

10.3只引用属于自己的存贮空间。

56

10.4防止引用已经释放的内存空间。

56

10.5内存及时释放57

10.6文件句柄及时关闭57

10.7防止内存操作越界58

10.8认真处理程序所能遇到的各种出错情况59

10.9初始化变量59

10.10数据一致性检查59

10.11严禁随意更改其它模块或系统的有关设置和配置59

10.12不能随意改变与其它模块的接口59

10.13系统接口59

10.14编程时,要防止差1错误61

10.15操作符检查61

10.16分支语句写完整62

10.17使用return语句62

10.18不要滥用goto语句62

10.19其他62

11代码编辑、编译、审查65

11.1打开编译器的所有告警开关对程序进行编译65

11.2在产品软件(项目组)中,要统一编译开关选项65

11.3通过代码走读及审查方式对代码进行检查。

65

11.4测试部测试产品之前,应对代码进行抽查及评审65

11.5其他65

12代码测试、维护67

12.1单元测试要求至少达到语句覆盖67

12.2单元测试开始要跟踪每一条语句,并观察数据流及变量的变化67

12.3清理、整理或优化后的代码要经过审查及测试。

67

12.4代码版本升级要经过严格测试67

12.5使用工具软件对代码版本进行维护67

12.6正式版本上软件的任何修改都应有详细的文档记录67

12.7其他67

13宏68

13.1用宏定义表达式时,要使用完备的括号68

13.2将宏所定义的多条表达式放在大括号中68

13.3使用宏时,不允许参数发生变化69

 

1概述

1.1编写目的

为规范软件开发人员的代码编写提供参考依据和统一标准。

1.2文档约定

说明本文档中所用到的专用术语定义或解释,缩略词定义。

1.3预期的读者和阅读建议

本文档适用于所有软件开发人员。

1.4参考文献

列出有关的参考文件,如:

a.属于本项目的其他已发表文件;

b.本文件中各处引用的文档资料。

列出这些文件的标题、作者,说明能够得到这些文件资料的来源。

2排版要求

2.1程序块缩进

程序块要采用缩进风格编写,缩进的空格数为4个。

说明:

对于由开发工具自动生成的代码可以有不一致。

2.2程序块之间空行

相对独立的程序块之间、变量说明之后必须加空行。

示例:

如下例子不符合规范。

if(!

valid_ni(ni))

{

...//programcode

}

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

应如下书写

if(!

valid_ni(ni))

{

...//programcode

}

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

2.3长语句和长表达式

较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

示例:

perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN

+STAT_SIZE_PER_FRAM*sizeof(_UL);

act_task_table[frame_id*STAT_TASK_CHECK_NUMBER+index].occupied

=stat_poi[index].occupied;

act_task_table[taskno].duration_true_or_false

=SYS_get_sccp_statistic_state(stat_item);

report_or_not_flag=((taskno

&&(n7stat_stat_item_valid(stat_item))

&&(act_task_table[taskno].result_data!

=0));

2.4循环、判断等长表达式或语句

循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

示例:

if((taskno

&&(n7stat_stat_item_valid(stat_item)))

{

...//programcode

}

for(i=0,j=0;(i

&&(j

{

...//programcode

}

for(i=0,j=0;

(i

i++,j++)

{

...//programcode

}

2.5长参数

若函数或过程中的参数较长,则要进行适当的划分。

示例:

n7stat_str_compare((BYTE*)&stat_object,

(BYTE*)&(act_task_table[taskno].stat_object),

sizeof(_STAT_OBJECT));

n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER

+index,stat_object);

2.6短语句

不允许把多个短语句写在一行中,即一行只写一条语句。

示例:

如下例子不符合规范。

rect.length=0;rect.width=0;

应如下书写

rect.length=0;

rect.width=0;

2.7条件、循环语句

if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。

示例:

如下例子不符合规范。

if(pUserCR==NULL)return;

应如下书写:

if(pUserCR==NULL)

{

return;

}

2.8语句对齐

对齐只使用空格键,不使用TAB键。

说明:

以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐,

不要使用BC作为编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。

2.9函数、过程和结构等语句块

函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。

2.10程序块分界符

程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。

在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。

示例:

如下例子不符合规范。

for(...){

...//programcode

}

if(...)

{

...//programcode

}

voidexample_fun(void)

{

...//programcode

}

应如下书写。

for(...)

{

...//programcode

}

if(...)

{

...//programcode

}

voidexample_fun(void)

{

...//programcode

}

2.11操作符前后空格

在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

说明:

采用这种松散方式编写代码的目的是使代码更加清晰。

由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。

在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。

给操作符留空格时不要连续留两个以上空格。

示例:

(1)逗号、分号只在后面加空格。

inta,b,c;

(2)比较操作符,赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。

if(current_time>=MAX_TIME_VALUE)

a=b+c;

a*=2;

a=b^2;

(3)"!

"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。

*p='a';//内容操作"*"与内容之间

flag=!

isEmpty;//非操作"!

"与内容之间

p=&mem;//地址操作"&"与内容之间

i++;//"++","--"与内容之间

(4)"->"、"."前后不加空格。

p->id=pid;//"->"指针前后不加空格

(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。

if(a>=b&&c>d)

2.12其他

2.12.1一行程序以小于80字符为宜,不要写得过长。

3注释

3.1有效注释量

一般情况下,源程序有效注释量必须在20%以上。

说明:

注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不

能太少,注释语言必须准确、易懂、简洁。

3.2公司标识

在头文件中加入公司标识。

示例如下:

**************************************************************************/

/*                                                                      */

/*Copyright(c)1996-1998 XXXXXXCompany                        */

/*                 xxxxxxxx 版权所有1996-1998 */

/*                                                                      */

/*PROPRIETARYRIGHTSof XXXXXXCompany areinvolvedinthe       */

/*subject matterofthismaterial. Allmanufacturing,reproduction,use,*/

/*and salesrightspertainingtothissubjectmatteraregovernedbythe */

/*licenseagreement. Therecipientofthissoftwareimplicitlyaccepts*/

/*thetermsofthelicense.                                            */

/*本软件文档资料是xxx公司的资产,任何人士阅读和使用本资料必须获得  */

/*相应的书面授权,承担保密责任和接受相应的法律约束.                     */

/*                                                                      */

/**************************************************************************/

3.3说明性文件

说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:

版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

示例:

下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

/*************************************************

Copyright(C),1996-1998,xxxxx.Co.,Ltd.

Filename:

//文件名

Author:

Version:

Date:

//作者、版本及完成日期

Description:

//用于详细说明此程序文件完成的主要功能,与其他模块

//或函数的接口,输出值、取值范围、含义及参数间的控

//制、顺序、独立或依赖等关系

Others:

//其它内容的说明

FunctionList:

//主要函数列表,每条记录应包括函数名及功能简要说明

1.....

History:

//修改历史记录列表,每条修改记录应包括修改日期、修改

//者及修改内容简述

1.Date:

Author:

Modification:

2....

*************************************************/

3.4源文件头

源文件头部应进行注释,列出:

版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。

示例:

下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

/************************************************************

Copyright(C),1988-1999,XxxxxxTech.Co.,Ltd.

FileName:

test.cpp

Author:

Version:

Date:

Description:

//模块描述

Version:

//版本信息

FunctionList:

//主要函数及其功能

1.-------

History:

//历史修改记录

David96/10/121.0buildthismoudle

***********************************************************/

说明:

Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。

History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。

3.5函数头部说明

函数头部应进行注释,列出:

函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。

示例:

下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

/*************************************************

Function:

//函数名称

Description:

//函数功能、性能等的描述

Calls:

//被本函数调用的函数清单

CalledBy:

//调用本函数的函数清单

TableAccessed:

//被访问的表(此项仅对于牵扯到数据库操作的程序)

TableUpdated:

//被修改的表(此项仅对于牵扯到数据库操作的程序)

Input:

//输入参数说明,包括每个参数的作

//用、取值说明及参数间关系。

Output:

//对输出参数的说明。

Return:

//函数返回值的说明

Others:

//其它说明

*************************************************/

3.6注释与代码一致

边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。

不再有用的注释要删除。

3.7注释内容

注释的内容要清楚、明了,含义准确,防止注释二义性。

说明:

错误的注释不但无益反而有害。

3.8注释缩写

避免在注释中使用缩写。

说明:

在使用缩写时或之前,应对缩写进行必要的说明。

3.9注释位置

注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

示例:

如下例子不符合规范。

例1:

/*getreplicatesubsystemindexandnetindicator*/

 

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

例2:

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

/*getreplicatesubsystemindexandnetindicator*/

应如下书写

/*getreplicatesubsystemindexandnetindicator*/

repssn_ind=ssn_data[index].repssn_index;

repssn_ni=ssn_data[index].ni;

3.10变量、常量注释

对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。

变量、常量、宏的注释应放在其上方相邻位置或右方。

示例:

/*activestatistictasknumber*/

#defineMAX_ACT_TASK_NUMBER1000

#defineMAX_ACT_TASK_NUMBER1000/*activestatistictasknumber*/

3.11数据结构的注释

数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。

对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。

示例:

可按如下形式说明枚举/数据/联合结构。

/*sccpinterfacewithsccpuserprimitivemessagename*/

enumSCCP_USER_PRIMITIVE

{

N_UNITDATA_IND,/*sccpnotifysccpuserunitdatacome*/

N_NOTICE_IND,/*sccpnotifyusertheNo.7networkcannot*/

/*transmissionthismessage*/

N_UNITDATA_REQ,/*sccpuser'sunitdatatransmissionrequest*/

};

3.12全局变量

全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

示例:

/*TheErrorCodewhenSCCPtra

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2