华为软件编程规范.doc

上传人:wj 文档编号:1236300 上传时间:2023-04-30 格式:DOC 页数:24 大小:127KB
下载 相关 举报
华为软件编程规范.doc_第1页
第1页 / 共24页
华为软件编程规范.doc_第2页
第2页 / 共24页
华为软件编程规范.doc_第3页
第3页 / 共24页
华为软件编程规范.doc_第4页
第4页 / 共24页
华为软件编程规范.doc_第5页
第5页 / 共24页
华为软件编程规范.doc_第6页
第6页 / 共24页
华为软件编程规范.doc_第7页
第7页 / 共24页
华为软件编程规范.doc_第8页
第8页 / 共24页
华为软件编程规范.doc_第9页
第9页 / 共24页
华为软件编程规范.doc_第10页
第10页 / 共24页
华为软件编程规范.doc_第11页
第11页 / 共24页
华为软件编程规范.doc_第12页
第12页 / 共24页
华为软件编程规范.doc_第13页
第13页 / 共24页
华为软件编程规范.doc_第14页
第14页 / 共24页
华为软件编程规范.doc_第15页
第15页 / 共24页
华为软件编程规范.doc_第16页
第16页 / 共24页
华为软件编程规范.doc_第17页
第17页 / 共24页
华为软件编程规范.doc_第18页
第18页 / 共24页
华为软件编程规范.doc_第19页
第19页 / 共24页
华为软件编程规范.doc_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

华为软件编程规范.doc

《华为软件编程规范.doc》由会员分享,可在线阅读,更多相关《华为软件编程规范.doc(24页珍藏版)》请在冰点文库上搜索。

华为软件编程规范.doc

北京世纪百合技术有限公司软件编程规范第20页共24页

文档编号

产品版本

受控状态

DC-SB-2003-1005

V1.0

内部Page:

1

密级可以选择以下几种:

无,一般,内部,组内,秘密,绝密等。

产品名称:

软件编程规范

共页

软件编程规范

(仅供内部使用)

北京世纪百合科技有限公司

BeijingCenturialLilyTechnologyCo.,Ltd.

版权所有不得复制

文档修改记录

版本号

日期

所改页

注记

提交人

批准人

目录

1. 引言 4

1.1 目的 4

1.2 范围 4

2. 规范 4

2.1 文件 4

2.2 版面风格 4

2.3 标识符命名 8

2.4 函数与宏 10

2.5 代码的可靠性 14

3. 附录:

通用类型的公共定义 19

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)LilyOfTheCenturyTechnologyCo.,LTD.

ALLRIGHTSRESERVED

Description:

//用于详细说明此程序文件完成的主要功能

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

#ifndef_IPF_IP_H

#define_IPF_IP_H

...

<头文件正文>

...

#endif

2.1.3头文件的定义要有层次,禁止交叉引用。

说明:

头文件的层次设置为公共模块、私有模块。

头文件的引用次序为下层头文件引用上层头文件、私有头文件引用公共头文件,声明结构时尤其要注意,不允许出现交叉引用的情况。

示例:

如下定义不符合规范

头文件isdn_a.h

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

Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.

ALLRIGHTSRESERVED

Description:

定义配置数据结构

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

#ifndef_ISDN_A_H

#define_ISDN_A_H

#include“isdn_b.h”

typedefstruct

{

...;

ISDN_CONTROLstIsdnControl;

...;

}ISDN_CONFIG;

#endif

头文件isdn_b.h

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

Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.

ALLRIGHTSRESERVED

Description:

定义控制数据结构

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

#ifndef_ISDN_B_H

#define_ISDN_B_H

#include“isdn_a.h”

typedefstruct

{

...;

ISDN_CONFIGstIsdnConfig;

...;

}ISDN_CONTROL;

#endif

为了解决上述矛盾,可以将两个结构合并到一个文件中声明。

2.1.4文件中如果引用系统头文件,必须使用“<“和“>“;如果引用自定义的头文件,必须使用“”“和“”“。

说明:

系统头文件是指由编译系统提供的头文件。

示例:

如下书写不符合规范。

#include“stdlib.h”

#include

应该改作:

#include

#include“isdn_config.h”

2.1.5头文件中只能声明变量类型,禁止定义变量。

说明:

如果在头文件中定义变量,当有多个源文件引用该头文件时,会出现重复定义的错误。

示例:

如下头文件是不规范的。

头文件isdn_a.h

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

Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.

ALLRIGHTSRESERVED

Description:

定义配置数据结构

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

#ifndef_ISDN_A_H

#define_ISDN_A_H

typedefstruct

{

...;

}ISDN_CONFIG;

ISDN_CONFIGg_stIsdnConfig;

#endif

结构变量g_stIsdnConfig不能在头文件中定义,只能在源文件中定义。

可以在相应的源文件定义后,头文件作如下改动:

ISDN_CONFIGg_stIsdnConfig;改为

externISDN_CONFIGg_stIsdnConfig;

2.1.6头文件的声明顺序,应该有层次感。

说明:

头文件的声明顺序一般是宏、结构、函数、变量。

函数在头文件中声明时开头可以不加“extern”

2.1.7源文件名称一律小写,格式为:

子系统名_文件名.c,

示例:

ipf_pkt.c表示在IPF子系统的包处理文件。

2.1.8源文件必须加注释头。

源文件注释头格式为:

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

Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.

ALLRIGHTSRESERVED

Description:

//用于详细说明此程序文件完成的主要功能

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

2.2版面风格

2.2.1程序块采用缩进风格编写,缩进使用TAB符号,TAB符号规定为4个空格。

变量说明之后必须加空行。

说明:

由开发工具自动生成的代码例外。

示例:

如下例子不符合规范。

voidisdn_InitConfig(void)

{

WORDwConfigNumner;

...;//programcode

}

应如下书写

voidisdn_InitConfig(void)

{

WORDwConfigNumner;

...;//programcode

}

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

示例:

如下例子不符合规范。

wLength=wWidth=0;

或wLength=0,wWidth=0;

应如下书写

wLength=0;

wWidth=0;

禁止如下写法:

inti=j=0;

或inti=0,j=0;

应该写作:

inti=0;

intj=0;

inti,j;

i=0;

j=0;

2.2.3do、while、switch、case、default、if、else、for等语句自占一行,且if、else语句在同一列。

示例1:

如下例子不符合规范。

do{

...;//programcode

}while(pstUser!

=NULL);

应如下书写:

do

{

...;//programcode

}while(pstUser!

=NULL);

示例2:

如下例子不符合规范。

while(pstUser!

=NULL){

...;//programcode

}

应如下书写:

while(pstUser!

=NULL)

{

...;//programcode

}

示例3:

如下例子不符合规范。

switch(dwCounter){

case1:

dwCounter++;

...;//programcode

break;

default:

break;

}

应如下书写:

switch(dwCounter)

{

case1:

dwCounter++;

...;//programcode

break;

default:

break;

}

示例4:

如下例子不符合规范。

if(pstUser==NULL)return;

else{

...;//programcode

}

应如下书写:

if(pstUser==NULL)

{

return;

}

else

{

...;//programcode

}

示例5:

如下例子不符合规范。

for(i=0;i<10;i++){

...;//programcode

}

应如下书写:

for(i=0;i<10;i++)

{

...;//programcode

}

2.2.4函数的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。

示例:

如下例子不符合规范。

intisdn_Config(void)

{

...;//programcode

return0;

}

应该改为

intisdn_Config(void)

{

...;//programcode

return0;

}

示例:

如下例子不符合规范。

typedefstruct

{

WORDwSlot;

WORDwPort;

}ISDN_CONFIG;

应该改为

typedefstruct

{

WORDwSlot;

WORDwPort;

}ISDN_CONFIG;

2.2.5在switch的处理程序块中,case和default语句下的处理语句也要遵从语句缩进要求。

示例:

以下写法是不规范的

switch(wEvent)

{

case1:

...;//programcode

break;

}

应该改为:

switch(wEvent)

{

case1:

...;//programcode

break;

default:

break;

}

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

示例:

如下例子不符合规范。

if(...)

{

...//programcode

}

voidisdn_ExampleFun(void){

...//programcode

}

应如下书写。

if(...)

{

...//programcode

}

voidisdn_ExampleFun(void)

{

...;//programcode

}

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

函数的名称、功能、输入参数、输出参数、返回值等。

示例:

编写函数时候按照下面这段注释编写。

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

FuncName:

//函数名称

Description:

//函数功能的描述

Input:

//输入参数说明

Output:

//对输出参数和函数返回值的说明

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

2.2.8注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面。

示例:

如下例子不符合规范。

isdn_Init();

//初始化ISDN任务

应如下书写:

//初始化ISDN任务

isdn_Init();

2.2.9对有实际含义的变量或者常量的注释,应放在其上方相邻位置或右方。

对宏的注释,应放在上面,不可放在其右方或下方。

对数据结构的声明(包括数组、结构、类、枚举等),注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。

示例:

以下写法不规范

#defineERROR_MSG_ON//错误信息打印输出开关

应改为

//错误信息打印输出开关

#defineERROR_MSG_ON

2.2.10允许使用”//”进行注释

示例:

以下注释是允许的

//根据CFM所存的配置信息更新接口配置信息

voidisdn_SetConfigData(void)

{

...;//programcode

}

2.3标识符命名

2.3.1局部变量采用大小写混排的匈牙利方式命名,命名格式为前缀+变量名称,其中变量名由一个或一个以上的单词组成,每个单词首字母大写,其余一律小写。

说明:

前缀要表明变量类型。

下表为定义变量时候使用的前缀。

类型

前缀

类型名称

BOOLEAN

b

布尔型

BYTE

by

无符号字符型

WORD

w

无符号短整型

DWORD

dw

无符号长整型

char

c

字符型

short

s

短整型

int

i

整型

long

l

长整型

st

结构类型

un

联合类型

p

指针

pby

BYTE的指针

pw

WORD的指针

pdw

DWORD的指针

pst

结构的指针

pun

联合的指针

pa

数组的指针

pfn

函数指针

pm

消息的指针

pc

字符型的指针

ps

短整型的指针

pi

整型的指针

pl

长整型的指针

pp(根据类型添加其他前缀)

指针的指针

a

数组

aby

BYTE数组

aw

WORD数组

adw

DWORD数组

ast

结构数组

aun

联合数组

afn

函数数组

ac

字符型数组

as

短整型数组

ai

整型数组

al

长整型数组

sz

以null结尾的字符串型

 注:

类成员变量前应加前缀m_;

示例:

以下的书写不规范

WORDslot;

BYTE*byAccess;

DWORDarp_frame_count;

应该写作:

WORDwSlot;

BYTE*pbyAccess;

DWORDdwArpFrameCount;

2.3.2普通宏的定义使用全大写字母加下划线的方式,结构为:

子系统+下划线+宏内容名称。

示例:

#defineIP_MAX_HWA_LEN6

#defineIP_VER(x)((x>>4)&0xF0)

2.3.3函数的命名为:

前缀+下划线+字符串。

其中前缀为全小写的子系统名称,字符串由一个或多个单词组成,每个单词首字母大写,其他字母小写。

示例:

voidMsgCreate(void);

voidicmp_PktRecv(void);

2.3.4调试用的编译开关是开头为下划线的全大写字符串,具体格式是:

下划线+DEBUG+子系统名称+下划线+名称。

示例:

_DEBUG_IPF_IP_PACKET、_DEBUG_TCP_OPTION等。

2.3.5结构联合类型命名规则为:

子系统名称+下划线+结构名称、子系统名称+下划线+联合名称,其中所有字母大写。

示例:

typedefstruct

{

...;

}IP_TRACEROUTE;

typedefunion

{

...;

}ICMP_PKT;

2.3.6全局变量命名的具体格式是:

前缀+下划线+子系统名+下划线+字符串,其中前缀为小写的“g”,子系统名称全部小写,字符串由一个或多个单词组成,每个单词首字母大写,其他字母小写。

示例:

g_icmp_TraceRouteQueue、g_ospf_InterfList等。

2.3.7消息宏定义的采用一下格式:

前缀+下划线+字符串+下划线+后缀。

其中前缀采用小写的“mm”,字符串标记消息宏的具体含义,由一个或多个单词组成,每个单词首字母大写,其他字母小写,后缀为XXXtoYYY,表示消息的传送方向,XXX表示源子系统名,YYY为目的子系统名,全部用大写字母表示。

示例:

mm_AddRoute_BGPtoRTMGT表示从BGP协议发送到路由管理实体的增加一条路由的消息,mm_ShowIpRoute_CLItoRTMGT表示从CLI发送到路由管理子系统的要求显示路由表的消息。

2.4函数与宏

2.4.1对函数的返回值要仔细、全面地处理。

说明:

对提供返回值的函数,尤其是接口函数,其返回值必须检查。

示例:

以下函数是不规范的。

voidisdn_SendMessage(void)

{

...;//programcode

MsgPost(...);//发送消息

}

应该改作

voidisdn_SendMessage(void)

{

INT32iPost;

...;//programcode

iPost=MsgPost(...);//发送消息

if(iPost==OK)

{

...;//处理代码

}

else

{

...;//处理代码

}

}

2.4.2接口函数的输入参数(尤其是指针和数组下标)、非输入参数的合法性必须检查。

说明:

函数的输入主要有两种:

一种是参数输入;另一种是非参数输入,包括全局变量、数据文件等,这些参数都需要作检查。

示例:

下函数的实现不符合规范。

RESULTisdn_Receive(NI_CELL*pstCell,SK_BUF*pstSkBuf)

{

...;//接收数据代码

returnOK;

}

应改作以下写法。

RESULTisdn_Receive(NI_CELL*pstCell,SK_BUF*pstSkBuf)

{

if((pstCell==NULL)||(pstSkBuf==NULL))

{

returnFALSE;

}

...;//接收数据代码

returnOK;

}

2.4.3禁止把函数的参数作为工作变量。

说明:

需要做改变的参数,应该先用局部变量代之,最后再将该局部变量的内容赋给该参数。

示例:

下函数的实现不符合规范。

BOOLEANisdn_SumData(WORDwNumber,WORD*pwData,WORD*pwSum)

{

WORDwCount;

if((pwData==NULL)||(pwSum==NULL))

{

returnFALSE;

}

*pwSum=0;

for(wCount=0;wCount

{

*pwSum+=pwData[wCount];//pwSum成了工作变量,不规范

}

returnTRUE;

}

应改作以下写法。

BOOLEANisdn_SumData(WORDwNumber,WORD*pwData,WORD*pwSum)

{

WORDwCount;

WORDwSumTemp;

if((pwData==NULL)||(pwSum==NULL))

{

returnFALSE;

}

wSumTemp=0;

for(wCount=0;wCount

{

wSumTemp+=pwData[wCount];

}

*pwSum=wSumTemp;

returnTRUE;

}

2.4

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

当前位置:首页 > PPT模板 > 商务科技

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

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