搜档网
当前位置:搜档网 › 华为软件编码规范

华为软件编码规范

华为软件编码规范
华为软件编码规范

华为软件编程规范和范例

〔一〕=====[排版] ]=======.

〔二〕======[注释]=======.

〔三〕=====[标识符命名]=======.

〔四〕=====[可读性]======.

〔五〕=====[变量、结构]=====.

〔六〕=====[函数、过程]=====.

〔七〕=====[可测性]=====.

〔八〕=====[程序效率]=====.

〔九〕=====[质量保证]=====.

〔十〕=====[代码编辑、编译、审查]=====.

〔十一〕=====[代码测试、维护]=====.

〔十二〕=====[宏]=====.

〔一〕========[ 排版]========== 11-1:程序块要采用缩进风格编写,缩进的空格数为4个

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

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

示例:如下例子不符合规范。

Int ni;

if (!valid_ni(ni))

{

... // program code

}

repssn_ind = ssn_data[index].repssn_index;

repssn_ni = ssn_data[index].ni;

应如下书写

Int ni;

if (!valid_ni(ni))

{

... // program code

}

repssn_ind = ssn_data[index].repssn_index;

repssn_ni = ssn_data[index].ni;

11-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 < MAX_ACT_TASK_NUMBER)

&& (n7stat_stat_item_valid (stat_item))

&& (act_task_table[taskno].result_data != 0));

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

示例:

if ((taskno < max_act_task_number)

&& (n7stat_stat_item_valid (stat_item)))

{

... // program code

}

for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length)

&& (j < NewKeyword.word_length); i++, j++)

{

... // program code

}

for (i = 0, j = 0;

(i < first_word_length) && (j < second_word_length);

i++, j++)

{

... // program code

}

11-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 );

11-6:不允许把多个短语句写在一行中,即一行只写一条语句

示例:如下例子不符合规范。

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

应如下书写

rect.length = 0;

rect.width = 0;

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

示例:如下例子不符合规范。

if (pUserCR == NULL) return;

应如下书写:

if (pUserCR == NULL)

{

return;

}

11-8:对齐只使用空格键,不使用TAB键

说明:以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐,不要使用BC作为编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。

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

11-10:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式

示例:如下例子不符合规范。

for (...) {

... // program code

}

if (...)

{

... // program code

}

void example_fun( void )

{

... // program code

}

应如下书写。

for (...)

{

... // program code

}

if (...)

{

... // program code

}

void example_fun( void )

{

... // program code

}

11-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰

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

在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

示例:

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

int a, 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)

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

〔二〕======[ 注释]=======

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

说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

12-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明

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

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

Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.

File name: // 文件名

Author: Version: Date: // 作者、版本及完成日期

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

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

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

Others: // 其它内容的说明

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

1. ....

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

// 作者及修改内容简述

1. Date:

Author:

Modification:

2. ...

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

12-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。

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

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

Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.

FileName: test.cpp

Author: Version : Date:

Description: // 模块描述

Version: // 版本信息

Function List: // 主要函数及其功能

1. -------

History: // 历史修改记录

David 96/10/12 1.0 build this moudle

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

说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。

12-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等

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

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

Function: // 函数名称

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

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

Called By: // 调用本函数的函数清单

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

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

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

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

Output: // 对输出参数的说明。

Return: // 函数返回值的说明

Others: // 其它说明

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

12-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除

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

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

12-7:避免在注释中使用缩写,特别是非常用缩写

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

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

示例:如下例子不符合规范。

例1:

/* get replicate sub system index and net indicator */

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;

/* get replicate sub system index and net indicator */

应如下书写

/* get replicate sub system index and net indicator */

repssn_ind = ssn_data[index].repssn_index;

repssn_ni = ssn_data[index].ni;

12-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方

示例:

/* active statistic task number */

#define MAX_ACT_TASK_NUMBER 1000

#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */

12-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方

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

/* sccp interface with sccp user primitive message name */

enum SCCP_USER_PRIMITIVE

{

N_UNITDATA_IND, /* sccp notify sccp user unit data come */

N_NOTICE_IND, /* sccp notify user the No.7 network can not */

/* transmission this message */

N_UNITDATA_REQ, /* sccp user's unit data transmission request*/

};

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

示例:

/* The ErrorCode when SCCP translate */

/* Global Title failure, as follows */ // 变量作用、含义

/* 0 -SUCCESS 1 -GT Table error */

/* 2 -GT error Others -no use */ // 变量取值范围

/* only function SCCPTranslate() in */

/* this modual can modify it, and other */

/* module can visit it through call */

/* the function GetGTTransErrorCode() */ // 使用方法

BYTE g_GTTranErrorCode;

12-12:注释与所描述内容进行同样的缩排

说明:可使程序排版整齐,并方便注释的阅读与理解。

示例:如下例子,排版不整齐,阅读稍感不方便。

void example_fun( void )

{

/* code one comments */

CodeBlock One

/* code two comments */

CodeBlock Two

}

应改为如下布局。

void example_fun( void )

{

/* code one comments */

CodeBlock One

/* code two comments */

CodeBlock Two

}

12-13:将注释与其上面的代码用空行隔开

示例:如下例子,显得代码过于紧凑。

/* code one comments */

program code one

/* code two comments */

program code two

应如下书写

/* code one comments */

program code one

/* code two comments */

program code two

12-14:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释

说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。

12-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释

说明:这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。

示例(注意斜体加粗部分):

case CMD_UP:

ProcessUp();

break;

case CMD_DOWN:

ProcessDown();

break;

case CMD_FWD:

ProcessFwd();

if (...)

{

...

break;

}

else

{

ProcessCFW_B(); // now jump into case CMD_A

}

case CMD_A:

ProcessA();

break;

case CMD_B:

ProcessB();

break;

case CMD_C:

ProcessC();

break;

case CMD_D:

ProcessD();

break;

...

?2-1:避免在一行代码或表达式的中间插入注释

说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。

?2-2:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的

说明:清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释。

?2-3:在代码的功能、意图层次上进行注释,提供有用、额外的信息

说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。

示例:如下注释意义不大。

/* if receive_flag is TRUE */

if (receive_flag)

而如下的注释则给出了额外有用的信息。

/* if mtp receive a message from links */

if (receive_flag)

?2-4:在程序块的结束行右方加注释标记,以表明某程序块的结束

说明:当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。

示例:参见如下例子。

if (...)

{

// program code

while (index < MAX_INDEX)

{

// program code

} /* end of while (index < MAX_INDEX) */ // 指明该条while语句结束

} /* end of if (...)*/ // 指明是哪条if语句结束

?2-5:注释格式尽量统一,建议使用“/* …… */”

?2-6:注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达

说明:注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文。

〔三〕=====[ 标识符命名]=======

13-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解

说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。

示例:如下单词的缩写能够被大家基本认可。

temp 可缩写为tmp ;

flag 可缩写为flg ;

statistic 可缩写为stat ;

increment 可缩写为inc ;

message 可缩写为msg ;

13-2:命名中若使用特殊约定或缩写,则要有注释说明

说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。

13-3:自己特有的命名风格,要自始至终保持一致,不可来回变化

说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。

13-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的

说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。

示例:下面所示的局部变量名的定义方法可以借鉴。

int liv_Width

其变量名解释如下:

l 局部变量(Local)(其它:g 全局变量(Global)...)

i 数据类型(Interger)

v 变量(Variable)(其它:c 常量(Const)...)

Width 变量含义

这样可以防止局部变量与全局变量重名。

13-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的

示例:Add_User不允许,add_user、AddUser、m_AddUser允许。

?3-1:除非必要,不要用数字或较奇怪的字符来定义标识符

示例:如下命名,使人产生疑惑。

#define _EXAMPLE_0_TEST_

#define _EXAMPLE_1_TEST_

void set_sls00( BYTE sls );

应改为有意义的单词命名

#define _EXAMPLE_UNIT_TEST_

#define _EXAMPLE_ASSERT_TEST_

void set_udt_msg_sls( BYTE sls );

?3-2:在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突

说明:对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。

?3-3:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等

说明:下面是一些在软件中常用的反义词组。

add / remove begin / end create / destroy

insert / delete first / last g et / release

increment / decrement put / get

add / delete lock / unlock open / close

min / max old / new start / stop

next / previous source / target show / hide

send / receive source / destination

cut / paste up / down

示例:

int min_sum;

int max_sum;

int add_user( BYTE *user_name );

int delete_user( BYTE *user_name );

?3-4:除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义

〔四〕=====[ 可读性]======

14-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级

说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。示例:下列语句中的表达式

word = (high << 8) | low (1)

if ((a | b) && (a & c)) (2)

if ((a | b) < (c & d)) (3)

如果书写为:

high << 8 | low

a |

b && a & c

a |

b <

c & d

由于

high << 8 | low = ( high << 8) | low,

a |

b && a &

c = (a | b) && (a & c),

(1)(2)不会出错,但语句不易理解;

a |

b <

c &

d = a | (b < c)& d,(3)造成了判断条件出错。

14-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替

示例:如下的程序可读性差。

if (Trunk[index].trunk_state == 0)

{

Trunk[index].trunk_state = 1;

... // program code

}

应改为如下形式。

#define TRUNK_IDLE 0

#define TRUNK_BUSY 1

if (Trunk[index].trunk_state == TRUNK_IDLE)

{

Trunk[index].trunk_state = TRUNK_BUSY;

... // program code

}

?4-1:源程序中关系较为紧密的代码应尽可能相邻

说明:便于程序阅读和查找。

示例:以下代码布局不太合理。

rect.length = 10;

char_poi = str;

rect.width = 5;

若按如下形式书写,可能更清晰一些。

rect.length = 10;

rect.width = 5; // 矩形的长与宽关系较密切,放在一起。

char_poi = str;

?4-2:不要使用难懂的技巧性很高的语句,除非很有必要时

说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。

示例:如下表达式,考虑不周就可能出问题,也较难理解。

* stat_poi ++ += 1;

* ++ stat_poi += 1;

应分别改为如下:

*stat_poi += 1;

stat_poi++; // 此二语句功能相当于“ * stat_poi ++ += 1; ”

++ stat_poi;

*stat_poi += 1; // 此二语句功能相当于“ * ++ stat_poi += 1; ”

〔五〕=====[ 变量、结构]=====

15-1:去掉没必要的公共变量

说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。

15-2:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系

说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。

15-3:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等

说明:明确过程操作变量的关系后,将有利于程序的进一步优化、单元测试、系统联调以及代码维护等。这种关系的说明可在注释或文档中描述。

示例:在源文件中,可按如下注释形式说明。

RELATION System_Init Input_Rec Print_Rec Stat_Score

Student Create Modify Access Access

Score Create Modify Access Access, Modify

注:RELATION为操作关系;System_Init、Input_Rec、Print_Rec、Stat_Score为四个不同的函数;Student、Score为两个全局变量;Create表示创建,Modify表示修改,Access表示访问。

其中,函数Input_Rec、Stat_Score都可修改变量Score,故此变量将引起函数间较大的耦

合,并可能增加代码测试、维护的难度。

15-4:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生

说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。15-5:防止局部变量与公共变量同名

说明:若使用了较好的命名规则,那么此问题可自动消除。

15-6:严禁使用未经初始化的变量作为右值

说明:特别是在C/C++中引用未经赋值的指针,经常会引起系统崩溃。

?5-1:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象

说明:降低公共变量耦合度。

?5-2:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量

说明:使用标准的数据类型,有利于程序的移植。

示例:如下例子(在DOS下BC3.1环境中),在移植时可能产生问题。

void main()

{

register int index; // 寄存器变量

_AX = 0x4000; // _AX是BC3.1提供的寄存器“伪变量”

... // program code

}

?5-3:结构的功能要单一,是针对一种事务的抽象

说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。

示例:如下结构不太清晰、合理。

typedef struct STUDENT_STRU

{

unsigned char name[8]; /* student's name */

unsigned char age; /* student's age */

unsigned char sex; /* student's sex, as follows */

/* 0 - FEMALE; 1 - MALE */

unsigned char

teacher_name[8]; /* the student teacher's name */

unisgned char

teacher_sex; /* his teacher sex */

} STUDENT;

若改为如下,可能更合理些。

typedef struct TEACHER_STRU

{

unsigned char name[8]; /* teacher name */

unisgned char sex; /* teacher sex, as follows */

/* 0 - FEMALE; 1 - MALE */

} TEACHER;

typedef struct STUDENT_STRU

{

unsigned char name[8]; /* student's name */

unsigned char age; /* student's age */

unsigned char sex; /* student's sex, as follows */

/* 0 - FEMALE; 1 - MALE */

unsigned int teacher_ind; /* his teacher index */

} STUDENT;

?5-4:不要设计面面俱到、非常灵活的数据结构

说明:面面俱到、灵活的数据结构反而容易引起误解和操作困难。

?5-5:不同结构间的关系不要过于复杂

说明:若两个结构间关系较复杂、密切,那么应合为一个结构。

示例:如下两个结构的构造不合理。

typedef struct PERSON_ONE_STRU

{

unsigned char name[8];

unsigned char addr[40];

unsigned char sex;

unsigned char city[15];

} PERSON_ONE;

typedef struct PERSON_TWO_STRU

{

unsigned char name[8];

unsigned char age;

unsigned char tel;

} PERSON_TWO;

由于两个结构都是描述同一事物的,那么不如合成一个结构。

typedef struct PERSON_STRU

{

unsigned char name[8];

unsigned char age;

unsigned char sex;

unsigned char addr[40];

unsigned char city[15];

unsigned char tel;

} PERSON;

?5-6:结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数

说明:增加结构的可理解性、可操作性和可维护性。

示例:假如认为如上的_PERSON结构元素过多,那么可如下对之划分。

typedef struct PERSON_BASE_INFO_STRU

{

unsigned char name[8];

unsigned char age;

unsigned char sex;

} PERSON_BASE_INFO;

typedef struct PERSON_ADDRESS_STRU

{

unsigned char addr[40];

unsigned char city[15];

unsigned char tel;

} PERSON_ADDRESS;

typedef struct PERSON_STRU

{

PERSON_BASE_INFO person_base;

PERSON_ADDRESS person_addr;

} PERSON;

?5-7:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象

说明:合理排列结构中元素顺序,可节省空间并增加可理解性。

示例:如下结构中的位域排列,将占较大空间,可读性也稍差。

typedef struct EXAMPLE_STRU

{

unsigned int valid: 1;

PERSON person;

unsigned int set_flg: 1;

} EXAMPLE;

若改成如下形式,不仅可节省1字节空间,可读性也变好了。

typedef struct EXAMPLE_STRU

{

unsigned int valid: 1;

unsigned int set_flg: 1;

PERSON person ;

} EXAMPLE;

?5-8:结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)

说明:软件向前兼容的特性,是软件产品是否成功的重要标志之一。如果要想使产品具有较好的前向兼容,那么在产品设计之初就应为以后版本升级保留一定余地,并且在产品升级时必须考虑前一版本的各种特性。

?5-9:留心具体语言及编译器处理不同数据类型的原则及有关细节

说明:如在C语言中,static局部变量将在内存“数据区”中生成,而非static局部变量将在“堆栈”中生成。这些细节对程序质量的保证非常重要。

?5-10:编程时,要注意数据类型的强制转换

说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。

?5-11:对编译系统默认的数据类型转换,也要有充分的认识

示例:如下赋值,多数编译器不产生告警,但值的含义还是稍有变化。

char chr;

unsigned short int exam;

chr = -1;

exam = chr; // 编译器不产生告警,此时exam为0xFFFF。

?5-12:尽量减少没有必要的数据类型默认转换与强制转换

?5-13:合理地设计数据并使用自定义数据类型,避免数据间进行不必要的类型转换

?5-14:对自定义数据类型进行恰当命名,使它成为自描述性的,以提高代码可读性。注意其命名方式在同一产品中的统一

说明:使用自定义类型,可以弥补编程语言提供类型少、信息量不足的缺点,并能使程序清晰、简洁。

示例:可参考如下方式声明自定义数据类型。

下面的声明可使数据类型的使用简洁、明了。

typedef unsigned char BYTE;

typedef unsigned short WORD;

typedef unsigned int DWORD;

下面的声明可使数据类型具有更丰富的含义。

typedef float DISTANCE;

typedef float SCORE;

?5-15:当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题

说明:比如Intel CPU与68360 CPU,在处理位域及整数时,其在内存存放的“顺序”正好相反。

示例:假如有如下短整数及结构。

unsigned short int exam;

typedef struct EXAM_BIT_STRU

{ /* Intel 68360 */

unsigned int A1: 1; /* bit 0 7 */

unsigned int A2: 1; /* bit 1 6 */

unsigned int A3: 1; /* bit 2 5 */

} EXAM_BIT;

如下是Intel CPU生成短整数及位域的方式。

内存:0 1 2 ... (从低到高,以字节为单位)

exam exam低字节exam高字节

内存:0 bit 1 bit 2 bit ... (字节的各“位”)

EXAM_BIT A1 A2 A3

如下是68360 CPU生成短整数及位域的方式。

内存:0 1 2 ... (从低到高,以字节为单位)

exam exam高字节exam低字节

内存:7 bit 6 bit 5 bit ... (字节的各“位”)

EXAM_BIT A1 A2 A3

说明:在对齐方式下,CPU的运行效率要快得多。

示例:如下图,当一个long型数(如图中long1)在内存中的位置正好与内存的字边界对齐时,CPU存取这个数只需访问一次内存,而当一个long型数(如图中的long2)在内存中的位置跨越了字边界时,CPU存取这个数就需要多次访问内存,如i960cx访问这样的数需读内存三次(一个BYTE、一个SHORT、一个BYTE,由CPU的微代码执行,对软件透明),所有对齐方式下CPU的运行效率明显快多了。

1 8 16 24 32

------- ------- ------- -------

| long1 | long1 | long1 | long1 |

------- ------- ------- -------

| | | | long2 |

------- ------- ------- --------

| long2 | long2 | long2 | |

------- ------- ------- --------

| ....

〔六〕=====[ 函数、过程]=====

16-1:对所调用函数的错误返回码要仔细、全面地处理

16-2:明确函数功能,精确(而不是近似)地实现函数设计

16-3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量)

说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。

16-4:编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护

说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

示例:假设Exam是int型全局变量,函数Squre_Exam返回Exam平方值。那么如下函数不具有可重入性。

unsigned int example( int para )

{

unsigned int temp;

Exam = para; // (**)

temp = Square_Exam( );

return temp;

}

此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使Exam 赋与另一个不同的para值,所以当控制重新回到“temp = Square_Exam( )”后,计算出的

temp很可能不是预想中的结果。此函数应如下改进。

unsigned int example( int para )

{

unsigned int temp;

[申请信号量操作] // 若申请不到“信号量”,说明另外的进程正处于

Exam = para; // 给Exam赋值并计算其平方过程中(即正在使用此

temp = Square_Exam( ); // 信号),本进程必须等待其释放信号后,才可继

[释放信号量操作] // 续执行。若申请到信号,则可继续执行,但其

// 它进程必须等待本进程释放信号量后,才能再使

// 用本信号。

return temp;

}

16-5:在同一项目组应明确规定对接口函数参数的合法性检查应由函数的调用者负责还是由接口函数本身负责,缺省是由函数调用者负责

说明:对于模块间接口函数的参数的合法性检查这一问题,往往有两个极端现象,即:要么是调用者和被调用者对参数均不作合法性检查,结果就遗漏了合法性检查这一必要的处理过程,造成问题隐患;要么就是调用者和被调用者均对参数进行合法性检查,这种情况虽不会造成问题,但产生了冗余代码,降低了效率。

?6-1:防止将函数的参数作为工作变量

说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。

示例:下函数的实现不太好。

void sum_data( unsigned int num, int *data, int *sum )

{

unsigned int count;

*sum = 0;

for (count = 0; count < num; count++)

{

*sum += data[count]; // sum成了工作变量,不太好。

}

}

若改为如下,则更好些。

void sum_data( unsigned int num, int *data, int *sum )

{

unsigned int count ;

int sum_temp;

sum_temp = 0;

for (count = 0; count < num; count ++)

{

sum_temp += data[count];

}

*sum = sum_temp;

}

?6-2:函数的规模尽量限制在200行以内

说明:不包括注释和空格行。

?6-3:一个函数仅完成一件功能

?6-4:为简单功能编写函数

说明:虽然为仅用一两行就可完成的功能去编函数好象没有必要,但用函数可使功能明确化,增加程序可读性,亦可方便维护、测试。

示例:如下语句的功能不很明显。

value = ( a > b ) ? a : b ;

改为如下就很清晰了。

int max (int a, int b)

{

return ((a > b) ? a : b);

}

value = max (a, b);

或改为如下。

#define MAX (a, b) (((a) > (b)) ? (a) : (b))

value = MAX (a, b);

?6-5:不要设计多用途面面俱到的函数

说明:多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。

?6-6:函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出

说明:带有内部“存储器”的函数的功能可能是不可预测的,因为它的输出可能取决于内部存储器(如某标记)的状态。这样的函数既不易于理解又不利于测试和维护。在C/C++语言中,函数的static局部变量是函数的内部存储器,有可能使函数的功能不可预测,然而,当某函数的返回值为指针类型时,则必须是STATIC的局部变量的地址作为返回值,若为AUTO类,则返回为错针。

示例:如下函数,其返回值(即功能)是不可预测的。

unsigned int integer_sum( unsigned int base )

{

unsigned int index;

static unsigned int sum = 0; // 注意,是static类型的。

// 若改为auto类型,则函数即变为可预测。

for (index = 1; index <= base; index++)

{

sum += index;

}

return sum;

}

?6-7:尽量不要编写依赖于其他函数内部实现的函数

说明:此条为函数独立性的基本要求。由于目前大部分高级语言都是结构化的,所以通过具体语言的语法要求与编译器功能,基本就可以防止这种情况发生。但在汇编语言中,由于其灵活性,很可能使函数出现这种情况。

示例:如下是在DOS下TASM的汇编程序例子。过程Print_Msg的实现依赖于Input_Msg 的具体实现,这种程序是非结构化的,难以维护、修改。

... // 程序代码

proc Print_Msg // 过程(函数)Print_Msg

... // 程序代码

jmp LABEL

... // 程序代码

endp

proc Input_Msg // 过程(函数)Input_Msg

... // 程序代码

LABEL:

... // 程序代码

endp

?6-8:避免设计多参数函数,不使用的参数从接口中去掉

说明:目的减少函数间接口的复杂度。

?6-9:非调度函数应减少或防止控制参数,尽量只使用数据参数

说明:本建议目的是防止函数间的控制耦合。调度函数是指根据输入的消息类型或控制命令,来启动相应的功能实体(即函数或过程),而本身并不完成具体功能。控制参数是指改变函数功能行为的参数,即函数要根据此参数来决定具体怎样工作。非调度函数的控制参数增加了函数间的控制耦合,很可能使函数间的耦合度增大,并使函数的功能不唯一。

示例:如下函数构造不太合理。

int add_sub( int a, int b, unsigned char add_sub_flg )

{

if (add_sub_flg == INTEGER_ADD)

{

return (a + b);

}

else

{

return (a b);

}

}

不如分为如下两个函数清晰。

int add( int a, int b )

{

return (a + b);

}

int sub( int a, int b )

{

return (a b);

}

华为软件编程规范

华为软件编程规范Revised on November 25, 2020

目录 1 排版 6 2 注释11 3 标识符命名18 4 可读性20 5 变量、结构22 6 函数、过程28 7 可测性36 8 程序效率40 9 质量保证44 10 代码编辑、编译、审查50 11 代码测试、维护52 12 宏53

1 排版 11-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 11-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 应如下书写 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 11-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: + 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 < MAX_ACT_TASK_NUMBER) && (n7stat_stat_item_valid (stat_item)) && (act_task_table[taskno].result_data != 0));

华为JAVA编码规范

1.程序块采用缩进风格,空格为4个. 说明: 对于开发工具自动生成的代码可以不一致 2.分界符(如大括号{和})应各自占一行并且在同一列,同时与引用它们的 语句左对齐,在方法的开始,类和接口的定义,以及if,for,do,while,switch,case语句都要采用上述缩进 说明: for(…) { … 说明: if(filename != null && new File(logPath+filename).length() < ()) { 3.…作符) 说明: 采用这种松散方式编写代码目的是让程序更加清晰,由于空格所产生的清晰性是相对的,所以在已经很清晰的语句中没有必要留空格,如果语句已足够清晰,则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为java中括号已经是很清晰的标志了. 在长句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部

中不加空格,给操作符留空格时不要连续留两个以上空格 4.类属性和方法不要交叉放置,不同存取范围的属性和方法也不要交叉放 置 说明: 类定义:{ 类公有属性定义; 类保护属性定义; 类私有属性定义; 类公有方法定义; 类保护方法定义; 类私有方法定义; } 5.源程序的有效注释量必须在30%以上 6.包的注释写入一个名为的html格式的说明文件放入当前路径 7.包的注释内容:本包作用,详细描述本包内容,产品模块名称及版本,公 司版本 说明: 一句话描述 详细描述

产品模块
公司版本信息 8.文件注释:写入文件头部,包名之前 9.文件注释内容:版本说明,描述信息,修改历史,生成日期 说明: /* *文件名 *版权 *描述 *修改人 *修改时间 *修改内容 *跟踪单号 *修改单号 */ 10.类和接口注释:放在package注释之后,class或interface之前 11.类和接口注释内容:类的注释要一句话功能描述,功能详细描述 说明:

华为Java语言编码规范标准

Java语言编码规范 Prepared by 拟制Date 日期 yyyy-mm-dd Reviewed by 评审人Date 日期 yyyy-mm-dd Approved by 批准Date 日期 yyyy-mm-dd

Revision Record 修订记录

Table of Contents 目录 1. 范围 (4) 2. 规范性引用文件 (4) 3. 术语和定义 (4) 4. 排版规范 (5) 4.1. 规则 (5) 4.2. 建议 (7) 5. 注释规范 (9) 5.1. 规则 (9) 5.2. 建议 (15) 6. 命名规范 (17) 6.1. 规则 (17) 6.2. 建议 (18) 7. 编码规范 (20) 7.1. 规则 (20) 7.2. 建议 (24) 8. JTEST规范 (26) 8.1. 规则 (26) 8.2. 建议 (27)

1.范围 本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。 本规范适用于使用Java语言编程的产品和项目。 2.规范性引用文件 下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。 3.术语和定义 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 格式:对此规范格式的说明。 说明:对此规范或建议进行必要的解释。 示例:对此规范或建议从正、反两个方面给出例子。

华为软件编程规范.doc

文档编号产品版本受控状态 DC-SB-2003-1005V 1.0 内部 产品名称:软件编程规范共页 软件编程规范 (仅供内部使用) 北京世纪百合科技有限公司 Beijing Centurial Lily Technology Co.,Ltd. 版权所有不得复制

文档修改记录

目录 1.引言 (4) 1.1 目的 (4) 1.2 范围 (4) 2.规范 (4) 2.1 文件 (4) 2.2版面风格 (8) 2.3 标识符命名 (12) 2.4 函数与宏 (14) 2.5 代码的可靠性 (18) 3.附录:通用类型的公共定义 (23)

1.引言 1.1目的 本规范的目的在于增加源代码的可读性,减少程序员对代码理解上的偏差,使程序员能够编写出可靠的代码,降低代码维护成本。 1.2范围 本规范内容涉及范围包括:文件、版面、注释、标识符、变量和结构、函数、宏以及可理解性等。本规范适用于公司开发的所有软件产品。在新软件的编码过程中本规范必须执行。 2.规范 2.1文件 2.1.1头文件的名称一律为小写,格式为“子系统名_文件名.h”。例如: ipf_protocol.h等。 2.1.2头文件的格式如下: ?注释头,格式参见软件编程规范; ?头文件预编译开关开始,格式为: #ifndef 预编译开关 #define 预编译开关 其中预编译开关格式为:“ _文件名_H”,其中文件名一律大写 ?头文件内容; ?头文件预编译开关结束,格式为: #endif 用来和头文件预编译开关的开始对应。 例如:以下为ipf_ip.h头文件的内容: /************************************************************ Copyright (c) Lily Of The Century Technology Co., LTD. ALL RIGHTS RESERVED Description: // 用于详细说明此程序文件完成的主要功能 *************************************************************/ #ifndef _IPF_IP_H #define _IPF_IP_H ...

华为JAVA编程规范

1 Java 编程规范 1.1 排版 1.1.1 规则 规则1程序块要采用缩进风格编写,缩进的空格数为4个,不允许使用TAB缩进。(1.42+) 说明:缩进使程序更易阅读,使用空格缩进可以适应不同操作系统与不同开发工具。 规则2分界符(如大括号…{?和…}?)应各独占一行,同时与引用它们的语句左对齐。在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序 或者static、,synchronized等语句块中都要采用如上的缩进方式。(1.42+) 示例: if (a>b) { doStart(); } 规则3较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐, 语句可读。(1.42+) 示例: if (logger.isDebugEnabled()) { logger.debug("Session destroyed,call-id" + event.getSession().getCallId()); } 规则4不允许把多个短语句写在一行中,即一行只写一条语句(1.42+) 说明:阅读代码更加清晰 示例:如下例子不符合规范。 Object o = new Object(); Object b = null; 规则5if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while,switch等语句的执行语句无论多少都要加括号{},case 的执行语句中如果定义变量必须加括号{}。 (1.42+) 说明:阅读代码更加清晰,减少错误产生 示例: if (a>b) { doStart(); }

华为公司编程规范和范例(C++)

目录 1 排版 6 2 注释11 3 标识符命名18 4 可读性20 5 变量、结构22 6 函数、过程28 7 可测性36 8 程序效率40 9 质量保证44 10 代码编辑、编译、审查50 11 代码测试、维护52 12 宏53

1 排版 11-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 11-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni)) { ... // program code } repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_data[index].ni; 应如下书写 if (!valid_ni(ni)) { ... // program code } repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_data[index].ni; 11-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 < MAX_ACT_TASK_NUMBER)

华为公司招聘职位要求

华为公司招聘条件要求 软件研发工程师: 工作职责 : 负责通信系统软件模块的设计、编码、调试、测试等工作,参与相关质量活动,确保设计、实现、测试工作按时保质完成 职位要求: 1、计算机、通信或相关专业本科以上学历 2、熟悉C/C++、JAVA底层驱动软件编程,熟悉 TCP/IP 协议、 Internet 网的基本知识 3 、对通信知识有一定基础 4、能够熟练阅读和理解英文资料 2、硬件研发工程师 : 工作职责 : 从事单板硬件、光技术、逻辑、射频、装备、 机电、CAD器件可靠性等模块开发工作,参与相关质量活动, 确 保设计、实现、测试工作的按时保质完成。 职位要求: 1、电子、计算机、通信、自控、自动化相关专业本科以上学历 2、具备良好的数字、模拟电路基础 3、熟悉C/嵌入式系统开发/底层驱动软件编程/逻辑设计 4、能 够熟练阅读和理解英文资料芯片设计工程师: 工作职责 :

1、负责数字 / 模拟芯片开发和设计、验证、实现工作; 2、按照模块规格和芯片总体方案的要求,严格遵循开发流程、模板、标准和规范,承担 模块的详细设计和实施工作,确保开发工作按时按质完成; 3、及时编写各种设计文档和标准化资料,实现资源、经验共享。 职位要求: 1、微电子、计算机、通信工程等相关专业 2、了解或实际应用过 VHDL/Verilog 语言编程,掌握数字电路设计,或具有FPGA设计经验,或熟悉综合(SYN”时序分析(STA /布局布线(Place and routing ) /可测性设计(DFT,有相关工具应用的经验;或具有模拟 IC 设计项目经验 射频开发工程师: 工作职责 : 负责通讯设备射频模块的开发、设计和优化工作;从事无线基站通信设备天馈及其解决方案方面的研究和开发工作。 职位要求: 1、电子、通信、电磁场与微波、微电子半导体等专业本科及以上学历; 2、能够熟练阅读和理解英文资料; 3、掌握并有RF仿真经验(如ADS优先; 4、有射频产品开发经验优先。 云计算研发工程师:

华为代码规范文档

代码规范文档

目录 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)

华为软件编程地要求规范

软件编程规范 (仅供内部使用) 北京世纪百合科技有限公司 Beijing Centurial Lily Technology Co.,Ltd. 版权所有不得复制

文档修改记录

目录 1.引言 (6) 1.1 目的 (6) 1.2 范围 (6) 2.规范 (6) 2.1 文件 (6) 2.2版面风格 (4) 2.3 标识符命名 (9) 2.4 函数与宏 (11) 2.5 代码的可靠性 (15) 3.附录:通用类型的公共定义 (21)

1.引言 1.1目的 本规范的目的在于增加源代码的可读性,减少程序员对代码理解上的偏差,使程序员能够编写出可靠的代码,降低代码维护成本。 1.2范围 本规范内容涉及范围包括:文件、版面、注释、标识符、变量和结构、函数、宏以及可理解性等。本规范适用于公司开发的所有软件产品。在新软件的编码过程中本规范必须执行。 2.规范 2.1文件 2.1.1头文件的名称一律为小写,格式为“子系统名_文件名.h”。例如: ipf_protocol.h等。 2.1.2头文件的格式如下: 注释头,格式参见软件编程规范; 头文件预编译开关开始,格式为: #ifndef 预编译开关 #define 预编译开关 其中预编译开关格式为:“ _文件名_H”,其中文件名一律大写 头文件内容; 头文件预编译开关结束,格式为: #endif 用来和头文件预编译开关的开始对应。 例如:以下为ipf_ip.h头文件的内容: /************************************************************ Copyright (c) Lily Of The Century Technology Co., LTD. ALL RIGHTS RESERVED Description: // 用于详细说明此程序文件完成的主要功能 *************************************************************/ #ifndef _IPF_IP_H #define _IPF_IP_H ...

(完整版)阿里巴巴编码规范(Java)题库

多选 1.如何处理单元测试产生的数据,下列哪些说法是正确的?ABC A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码中进行判断和识别。 多选 2.关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。 C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。 D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式) 多选 3.下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。 B .永久弃用的代码段注释掉即可,即不用加任何注释。 C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。 D .不要在视图模板中加入任何复杂的逻辑。 多选 4.关于分页查询,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .分页查询,当统计的count为0时,应该直接返回,不要再执行分页查询语句。 B .iBATIS自带的queryForList(String statementName,int start,int size)分页接口有性能隐患,不允许使用。 C .定义明确的sql查询语句,通过传入参数start和size来实现分页逻辑。 D .可使用存储过程写分页逻辑,提高效率。

华为软件开发规范

软件开发规范 1 排版 11-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 11-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 应如下书写 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 11-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: = 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 < MAX_ACT_TASK_NUMBER) && (n7stat_stat_item_valid (stat_item)) && (act_task_table[taskno].result_data != 0));

PCB设计规范-华为

华为PCB设计规范 1..1 PCB(Print circuit Board):印刷电路板。 1..2 原理图:电路原理图,用原理图设计工具绘制的、表达硬件电路中各种器件之间的连接关系的图。 1..3 网络表:由原理图设计工具自动生成的、表达元器件电气连接关系的文本文件,一般包含元器件封装、网络列表和属性定义等组成部分。 1..4 布局:PCB设计过程中,按照设计要求,把元器件放臵到板上的过程。深圳市华为技术有限公司1999-07-30批准,1999-08-30实施。 1..5 仿真:在器件的IBIS MODEL或SPICE MODEL支持下,利用EDA设计工具对PCB的布局、布线效果进行仿真分析,从而在单板的物理实现之前发现设计中存在的EMC问题、时序问题和信号完整性问题,并找出适当的解决方案。深圳市华为技术有限公司1999-07-30批准,1999-08-30实施。 II. 目的 A. 本规范归定了我司PCB设计的流程和设计原则,主要目的是为PCB设计者提供必须遵循的规则和约定。 B. 提高PCB设计质量和设计效率。 提高PCB的可生产性、可测试、可维护性。 III. 设计任务受理 A. PCB设计申请流程 当硬件项目人员需要进行PCB设计时,须在《PCB设计投板申请表》中提出投板申请,并经其项目经理和计划处批准后,流程状态到达指定的PCB设计部门审批,此时硬件项目人员须准备好以下资料: ⒈经过评审的,完全正确的原理图,包括纸面文件和电子件; ⒉带有MRPII元件编码的正式的BOM; ⒊PCB结构图,应标明外形尺寸、安装孔大小及定位尺寸、接插件定位尺寸、禁止布线区等相关尺寸; ⒋对于新器件,即无MRPII编码的器件,需要提供封装资料; 以上资料经指定的PCB设计部门审批合格并指定PCB设计者后方可开始PCB设计。

华为JAVA编程规范试题

JAVA编程规范试题 一、判断题(每题2分,共28分) 1、if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while, switch, case等语句的执行语句无论多少都要加括号{}。 2、包的注释内容要求包括:简述本包的作用、详细描述本包的内容、产品模块 名称和版本、公司版权、生成日期等。 3、类注释部分,描述部分说明该类或者接口的功能、作用、使用方法和注意事 项,每次修改后增加作者、新版本号和当天的日期,@since 表示从那个版本开始就有这个类或者接口,@deprecated 表示不建议使用该类或者接口。4、对于方法内部用throw语句抛出的异常,必须在方法的注释中标明;对于所 调用的其他方法所抛出的异常,在注释中要求说明所有的异常;对于非RuntimeException,即throws子句声明会抛出的异常,必须在方法的注释中标明。 5、类名和接口使用完整的英文单词描述,每个英文单词的首字母使用大写、其 余字母使用小写的大小写混合法。 6、com.huawei.四级部门名称.项目名称,符合包命名规范。 7、不能用异常来做一般流程处理的方式,不要过多地使用异常,异常的处理效 率比条件分支低,而且异常的跳转流程难以预测。 8、划分类的时候,应该尽量把逻辑处理、数据和显示分离,实现类功能的多样 化。 9、一个方法不应抛出太多类型的异常,如果程序中需要分类处理异常,则将异 常根据分类组织成继承关系。 10、switch 语句中的 case 关键字要和后面的常量保持一个空格;如果有特殊 的需要要在switch语句中定义case以外的标签,需要在注释中说明。 11、没有被覆盖的友好方法和没有子类的友好类应该定义成final。 12、简单的类可以通过名字比较两个对象的类,推荐使用 getClass()或者 instanceof()。 13、不要调用 Thread 类的 resume(), suspend(),sleep(), stop() 方法。

java编码规范(建议稿,修改自华为规范)(1)解析

武汉中软卓越科技有限公司Java语言编码规范

Table of Contents 目录 1. 范围 (3) 2. 术语和定义 (3) 3. 排版规范 (4) 3.1. 规则 (4) 3.2. 建议 (6) 4. 注释规范 (7) 4.1. 规则 (7) 4.2. 建议 (12) 5. 命名规范 (14) 5.1. 规则 (14) 5.2. 建议 (15) 6. 编码规范 (17) 6.1. 规则 (17) 6.2. 建议 (20) 7. JTEST规范 (22) 7.1. 规则 (22) 7.2. 建议 (23)

1.范围 本规范规定了使用Java语言编程时排版、注释、命名、编码和JTest的规则和建议。 本规范适用于使用Java语言编程的案例、产品和项目。 2.术语和定义 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 格式:对此规范格式的说明。 说明:对此规范或建议进行必要的解释。 示例:对此规范或建议从正、反两个方面给出例子。

3.排版规范 3.1.规则 3.1.1.*程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 3.1.2.*语句块分隔符左括号‘{’应与语句块引用代码在同一行,右括号‘}’应另起一行并 与语句块引用代码左对齐。在函数体的开始、类和接口的定义、以及if、for、do、 while、switch、case语句中的程序都要采用如上的缩进方式。 示例:如下例子不符合规范。 for (...) { ... // program code } if (...) { ... // program code } void example_fun( void ) { ... // program code } 应如下书写: for (...){ ... // program code } if (...){ ... // program code } void example_fun( void ){ ... // program code } 3.1.3.*较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作 符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: if (filename != null && new File(logPath + filename).length() < LogConfig.getFileSize()){ ... // program code } public static LogIterator read(String logType, Date startTime, Date endTime, int logLevel, String userName, int bufferNum) 3.1.4.*不允许把多个短语句写在一行中,即一行只写一条语句

华为钢网设计规范(网络软件)

DKBA 华为技术有限公司企业技术规范 钢网设计规范 华为技术有限公司发布

版权所有侵权必究

目次 前 言 ................................................................................. .. (3) 1 范围 6 2 规范性引用文件 6 3 术语和定义 6 4 材料、制作方法、文件格式 6 4.1 网框材料 6 4.2 钢片材料 6 4.3 张网用丝网及钢丝网 6 4.4 张网用的胶布,胶 6 4.5 制作方法7 4.6 文件格式7 5 钢网外形及标识的要求7 5.1 外形图7 5.2 PCB居中要求8 5.3 厂商标识内容及位置8 5.4 钢网标识内容及位置8 5.5 钢网标签内容及位置8 5.6 MARK点8 6 钢片厚度的选择9 6.1 焊膏印刷用钢网9 6.2 通孔回流焊接用钢网9 6.3 BGA维修用植球小钢网9 6.4 贴片胶印刷用钢网9 7 焊膏印刷钢网开孔设计9 7.1 一般原则9 7.2 CHIP类元件10 7.2.1 0603及以上10 7.2.2 0402 11 7.3 小外形晶体11

7.3.1 SOT23-1、SOT23-5 11 7.3.2 SOT89 11 7.3.3 SOT143 12 7.3.4 SOT223 12 7.3.5 SOT252,SOT263,SOT-PAK 12 7.4 VCO器件12 7.5 耦合器元件(LCCC) 13 7.6 表贴晶振13 7.7 排阻14 7.8 周边型引脚IC 14 7.8.1 Pitch≤0.65mm的IC 14 7.8.2 Pitch>0.65mm的IC 14 7.9 双边缘连接器14 7.10 面阵型引脚IC 14 7.10.1 PBGA 14 7.10.2 CBGA,CCGA 15 7.11 其它问题15 7.11.1 CHIP元件共用焊盘15 7.11.2 大焊盘15 7.12 通孔回流焊接器件16 7.12.1 焊点焊膏量的计算16 7.12.2 钢网开口的设计17 7.12.3 钢网开口尺寸的计算17 7.13 BGA 植球钢网开口设计18 7.14 特例18 8 印胶钢网开口设计18 8.1 CHIP元件18 8.2 小外形晶体管19 8.2.1 SOT23 19 8.2.2 SOT89 19 8.2.3 SOT143 19 8.2.4 SOT252 19 8.2.5 SOT223 20

DKBA04000190-E华为图纸说明规范

DKBA 华为技术有限公司内部技术规范 Technical Specification of Huawei Technologies Co., Ltd DKBA0.400.0190 REV.E 代替 DKBA 0.400.0190 REV.D 华为图纸说明规范 Specification of Explanation for Huawei Drawings 2014年06月30日发布 2014年07月05日实施 Released on Jun. 30, 2014 Implemented on Jul. 05, 2014

华为技术有限公司Huawei Technologies Co., Ltd. 版权所有侵权必究 All rights reserved

修订声明 Revision declaration 本规范拟制与解释部门:华为技术有限公司整机工程部 本规范的相关系列规范或文件:无 相关国际规范或文件一致性:无 替代或作废的其它规范或文件:DKBA 0.400.0190 REV.D 相关规范或文件的相互关系:无 规范号主要起草 部门专家主要评审部门专 家 修订情况 DKBA0.400.0190.V. A基础平台 部:郭天 次 00140571结构基础平台部: 肖春秀53994/潘建 军00118387/黄涛 00121968/郑玲 00119690/詹傲芳 62070/朱光胜 67118/郑光明 00115376/邓顺庆 61647 采购认证管理部: 张卫国00174583 供应链管理部物料品 质部: 蒙光忠38711 第一版,整合DKBA0.400.0160结构材 料表示法和DKBA0.400.0002表面处理 代码,增加了对图框各部分内容说明 DKBA0.400.0190.V. B基础平台 部:郭天 次 00140571结构基础平台部: 胡邦红00216370 肖春秀53994 潘建军00118387 黄涛00121968 郑玲00119690 詹傲芳62070 朱光胜67118 郑光明00115376 邓顺庆61647 采购认证管理部: 孟庆伟00145066 供应链管理部物料品 质部: 蒙光忠38711 1、增加槽钢和角钢的标注说明; 2、增加表面处理代码:F226、G017、 G018、G161、G226、L015_3、 L016、L017、L226、X009;X226; 3、Film代号含义由“薄膜材料”改为 “面膜” 4、T001的生产质量要求英文版由 DKBA04000065改为DKBA04500067 5、所有“无色化学转化”改为“化学转 化” 6、X127和X202前处理由“锌钝化” 改为“预处理” 7、增加压铸件中1级面的标注说明 8、3.1、4.3、5.1小节增加标题。 9、删除表面处理代码:G016_3、 G158_3、G159_3、L158_3、L159_3 10、热浸涂的生产质量要求由: DKBA0.400.0177改为 DKBA0.450.0065 11、删除DKBA0.450.0015 12、去掉中外金属材料对照表 13、增加Ins,绝缘材料类别 DKBA0.400.0190.V. C基础平台 部:汪磊 00205757结构基础平台部: 胡邦红00216370 肖春秀53994 潘建军00118387 ?明确关键尺寸定义。 ?增加参考尺寸说明。 ?增加表面处理代码L027、L028、 X010。

华为fpga设计规范(Verilog Hdl)

FPGA设计流程指南 前言 本部门所承担的FPGA设计任务主要是两方面的作用:系统的原型实现和ASIC的原型验证。编写本流程的目的是: ●在于规范整个设计流程,实现开发的合理性、一致性、高效性。 ●形成风格良好和完整的文档。 ●实现在FPGA不同厂家之间以及从FPGA到ASIC的顺利移植。 ●便于新员工快速掌握本部门FPGA的设计流程。 由于目前所用到的FPGA器件以Altera的为主,所以下面的例子也以Altera为例,工具组合为modelsim + LeonardoSpectrum/FPGACompilerII + Quartus,但原则和方法对于其他厂家和工具也是基本适用的。

目录 1. 基于HDL的FPGA设计流程概述 (1) 1.1 设计流程图 (1) 1.2 关键步骤的实现 (2) 1.2.1 功能仿真 (2) 1.2.2 逻辑综合 (2) 1.2.3 前仿真 (3) 1.2.4 布局布线 (3) 1.2.5 后仿真(时序仿真) (4) 2. Verilog HDL设计 (4) 2.1 编程风格(Coding Style)要求 (4) 2.1.1 文件 (4) 2.1.2 大小写 (5) 2.1.3 标识符 (5) 2.1.4 参数化设计 (5) 2.1.5 空行和空格 (5) 2.1.6 对齐和缩进 (5) 2.1.7 注释 (5) 2.1.8 参考C语言的资料 (5) 2.1.9 可视化设计方法 (6) 2.2 可综合设计 (6) 2.3 设计目录 (6) 3. 逻辑仿真 (6) 3.1 测试程序(test bench) (7) 3.2 使用预编译库 (7) 4. 逻辑综合 (8) 4.1 逻辑综合的一些原则 (8) 4.1.1 关于LeonardoSpectrum (8) 4.1.1 大规模设计的综合 (8) 4.1.3 必须重视工具产生的警告信息 (8) 4.2 调用模块的黑盒子(Black box)方法 (8) 参考 (10) 修订纪录 (10)

jv码规范华为

评审人日期 yyyy-mm-dd Approved by 批准Date 日期 yyyy-mm-dd

Revision Record 修订记录

Table of Contents 目录 1.范围 (4) 2.规范性引用文件 (4) 3.术语和定义 (4) 4.排版规范 (5) 4.1.规则 (5) 4.2.建议 (7) 5.注释规范 (8) 5.1.规则 (8) 6. 7. 8.

1.范围 本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。 本规范适用于使用Java语言编程的产品和项目。 2.规范性引用文件 下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本 3.

4.排版规范 4.1.规则 4.1.1.*程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 4.1.2.*分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语 句左对齐。在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。 符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: if (filename != null && new File(logPath + filename).length() < LogConfig.getFileSize()) { ... // program code } public static LogIterator read(String logType, Date startTime, Date endTime, int logLevel, String userName, int bufferNum)

华为的编程规范和范例(内部版)

目录 1 排版 6 2 注释11 3 标识符命名18 4 可读性20 5 变量、结构22 6 函数、过程28 7 可测性36 8 程序效率40 9 质量保证44 10 代码编辑、编译、审查50 11 代码测试、维护52 12 宏53

1 排版 11-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 11-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni)) { ... // program code } repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_data[index].ni; 应如下书写 if (!valid_ni(ni)) { ... // program code } repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_data[index].ni; 11-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 < MAX_ACT_TASK_NUMBER)

相关主题