华为软件编程地要求规范.docx
- 文档编号:25823067
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:30
- 大小:32.61KB
华为软件编程地要求规范.docx
《华为软件编程地要求规范.docx》由会员分享,可在线阅读,更多相关《华为软件编程地要求规范.docx(30页珍藏版)》请在冰豆网上搜索。
华为软件编程地要求规范
文档编号
产品版本
受控状态
DC-SB-2003-1005
V1.0
内部
产品名称:
软件编程规范
共页
软件编程规范
(仅供内部使用)
北京世纪百合科技有限公司
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.
ALLRIGHTSRESERVEDDescription:
//用于详细说明此程序文件完成的主要功能
*************************************************************/
#ifndef_IPF_IP_H
#define_IPF_IP_H
...
<头文件正文>
...
#endif
2.1.3头文件的定义要有层次,禁止交叉引用。
说明:
头文件的层次设置为公共模块、私有模块。
头文件的引用次序为下层头文件引用上层头文件、私有头文件引用公共头文件,声明结构时尤其要注意,不允许出现交叉引用的情况。
示例:
如下定义不符合规范
头文件isdn_a.h
/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.
ALLRIGHTSRESERVEDDescription:
定义配置数据结构
************************************************************/
#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.
ALLRIGHTSRESERVEDDescription:
定义控制数据结构
*************************************************************/
#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.
ALLRIGHTSRESERVEDDescription:
定义配置数据结构
*************************************************************/
#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.
ALLRIGHTSRESERVEDDescription:
//用于详细说明此程序文件完成的主要功能
*************************************************************/
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.4对于没有参数的函数,要定义为void。 说明: 目的减少函数间接口的复杂度。 示例: 如下函数写作不规范 BOOLEANisdn_Init() { ...;//programcode returnTRUE; } 应改作: BOOLEANisdn_Init(void) { ...;//programcode returnTRUE; } 2.4.5明确函数的返回值,当函数不需要返回值时要定义为void。 示例: 如下函数写作不规范 isdn_InitCtrlBlock(void) { ...;//programcode } 应改作: voidisdn_InitCtrlBlock(void) { ...;//programcode } 2.4.6用宏定义表达式时,要使用完备的括号。 示例: 如下定义的宏都存在一定的风险,不符合规范。 #defineMAX(a,b)a>b? a: b #defineMAX(a,b)(a>b? a: b) #defineMAX(a,b)(a)>(b)? (a): (b) 正确的定义应为: #defineMAX(a,b)((a)>(b)? (a): (b)) 2.4.7将宏所定义的多条表达式放在大括号中。 示例: 下面的定义不规
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 软件 编程 要求 规范