1、华为软件编程地要求规范文 档 编 号产品版本受控状态DC-SB-2003-1005V 1.0内部产品名称: 软件编程规范共 页软件编程规范(仅供内部使用)北京世纪百合科技有限公司Beijing Centurial Lily Technology Co.,Ltd.版权所有 不得复制文档修改记录版本号日期所改页注 记提交人批准人目 录1. 引言 41.1 目的 41.2 范围 42. 规范 42.1 文件 42.2 版面风格 42.3 标识符命名 82.4 函数与宏 102.5 代码的可靠性 143. 附录:通用类型的公共定义 191. 引言1.1 目的本规范的目的在于增加源代码的可读性,减少程序
2、员对代码理解上的偏差,使程序员能够编写出可靠的代码,降低代码维护成本。1.2 范围本规范内容涉及范围包括:文件、版面、注释、标识符、变量和结构、函数、宏以及可理解性等。本规范适用于公司开发的所有软件产品。在新软件的编码过程中本规范必须执行。2. 规范2.1 文件2.1.1 头文件的名称一律为小写,格式为“子系统名_文件名.h”。例如:ipf_protocol.h等。2.1.2 头文件的格式如下: 注释头,格式参见软件编程规范; 头文件预编译开关开始,格式为:#ifndef 预编译开关#define 预编译开关其中预编译开关格式为:“ _文件名_H”,其中文件名一律大写 头文件内容; 头文件预编
3、译开关结束,格式为:#endif用来和头文件预编译开关的开始对应。例如:以下为ipf_ip.h头文件的内容:/*Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescription: / 用于详细说明此程序文件完成的主要功能*/#ifndef _IPF_IP_H#define _IPF_IP_H.#endif2.1.3 头文件的定义要有层次,禁止交叉引用。说明:头文件的层次设置为公共模块、私有模块。头文件的引用次序为下层头文件引用上层头文件、私有头文件引用公共头文件,声明结构时尤其要注意,不允许
4、出现交叉引用的情况。示例:如下定义不符合规范头文件isdn_a.h/*Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescription: 定义配置数据结构*/#ifndef _ISDN_A_H#define _ISDN_A_H#include “isdn_b.h”typedef struct .; ISDN_CONTROL stIsdnControl; .;ISDN_ CONFIG;#endif头文件isdn_b.h/*Copyright (c) Lily Of The Century Te
5、chnology Co., LTD.ALL RIGHTS RESERVEDDescription: 定义控制数据结构*/#ifndef _ISDN_B_H#define _ISDN_B_H#include “isdn_a.h”typedef struct .; ISDN_CONFIG stIsdnConfig; .;ISDN_CONTROL;#endif为了解决上述矛盾,可以将两个结构合并到一个文件中声明。2.1.4 文件中如果引用系统头文件,必须使用“;如果引用自定义的头文件,必须使用“”“和“”“。说明:系统头文件是指由编译系统提供的头文件。示例:如下书写不符合规范。#include “s
6、tdlib.h”#include 应该改作:#include #include “isdn_config.h”2.1.5 头文件中只能声明变量类型,禁止定义变量。说明:如果在头文件中定义变量,当有多个源文件引用该头文件时,会出现重复定义的错误。示例:如下头文件是不规范的。头文件isdn_a.h/*Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescription: 定义配置数据结构*/#ifndef _ISDN_A_H#define _ISDN_A_Htypedef struct .;ISDN
7、_ CONFIG;ISDN_CONFIG g_stIsdnConfig;#endif 结构变量g_stIsdnConfig不能在头文件中定义,只能在源文件中定义。可以在相应的源文件定义后,头文件作如下改动:ISDN_CONFIG g_stIsdnConfig;改为extern ISDN_CONFIG g_stIsdnConfig;2.1.6 头文件的声明顺序,应该有层次感。说明:头文件的声明顺序一般是宏、结构、函数、变量。函数在头文件中声明时开头可以不加“extern”2.1.7 源文件名称一律小写,格式为:子系统名_文件名.c,示例:ipf_ pkt.c表示在IPF子系统的包处理文件。2.1
8、.8 源文件必须加注释头。源文件注释头格式为:/*Copyright (c) Lily Of The Century Technology Co.,LTD.ALL RIGHTS RESERVEDDescription: / 用于详细说明此程序文件完成的主要功能*/2.2 版面风格2.2.1 程序块采用缩进风格编写,缩进使用TAB符号,TAB符号规定为4个空格。变量说明之后必须加空行。说明:由开发工具自动生成的代码例外。示例:如下例子不符合规范。void isdn_InitConfig(void) WORD wConfigNumner; .; /program code应如下书写void isd
9、n_InitConfig(void) WORD wConfigNumner; .; /program code2.2.2 不允许把多个短语句写在一行中,一行只写一条语句。示例:如下例子不符合规范。wLength = wWidth = 0;或wLength = 0, wWidth = 0;应如下书写wLength = 0;wWidth = 0;禁止如下写法:int i = j = 0;或int i = 0,j = 0;应该写作:int i = 0;int j = 0;或int i,j;i = 0;j = 0;2.2.3 do、while、switch、case、default、if、else、f
10、or等语句自占一行,且if、else语句在同一列。 示例1:如下例子不符合规范。do .; /program code while (pstUser != NULL);应如下书写:do .; /program code while (pstUser != NULL);示例2:如下例子不符合规范。while (pstUser != NULL) .; /program code应如下书写:while (pstUser != NULL) .; /program code示例3:如下例子不符合规范。switch (dwCounter) case 1: dwCounter+; .; /program c
11、ode break; default:break;应如下书写:switch (dwCounter) case 1: dwCounter+; .; /program code break; default: break;示例4:如下例子不符合规范。if (pstUser = NULL) return;else .; /program code应如下书写:if (pstUser = NULL)return;else .; /program code示例5:如下例子不符合规范。for (i = 0;i 10;i+) .; /program code应如下书写:for (i = 0;i 4) & 0x
12、F0)2.3.3 函数的命名为:前缀+下划线+字符串。其中前缀为全小写的子系统名称,字符串由一个或多个单词组成,每个单词首字母大写,其他字母小写。示例:void MsgCreate(void);void icmp_PktRecv(void);2.3.4 调试用的编译开关是开头为下划线的全大写字符串,具体格式是:下划线+DEBUG+子系统名称+下划线+名称。示例:_DEBUG_IPF_IP_PACKET、_DEBUG_TCP_OPTION等。2.3.5 结构联合类型命名规则为:子系统名称+下划线+结构名称、子系统名称+下划线+联合名称,其中所有字母大写。示例:typedef struct .;I
13、P_TRACEROUTE;typedef union .;ICMP_PKT;2.3.6 全局变量命名的具体格式是:前缀+下划线+子系统名+下划线+字符串,其中前缀为小写的“g”,子系统名称全部小写,字符串由一个或多个单词组成,每个单词首字母大写,其他字母小写。示例:g_icmp_TraceRouteQueue、g_ospf_InterfList等。2.3.7 消息宏定义的采用一下格式:前缀+下划线+字符串+下划线+后缀。其中前缀采用小写的“mm”,字符串标记消息宏的具体含义,由一个或多个单词组成,每个单词首字母大写,其他字母小写,后缀为XXXtoYYY,表示消息的传送方向,XXX表示源子系统名
14、,YYY为目的子系统名,全部用大写字母表示。示例:mm_AddRoute_BGPtoRTMGT表示从BGP协议发送到路由管理实体的增加一条路由的消息,mm_ShowIpRoute_CLItoRTMGT表示从CLI发送到路由管理子系统的要求显示路由表的消息。2.4 函数与宏2.4.1 对函数的返回值要仔细、全面地处理。说明:对提供返回值的函数,尤其是接口函数,其返回值必须检查。示例:以下函数是不规范的。void isdn_SendMessage(void) .; /program code MsgPost(.); / 发送消息应该改作void isdn_SendMessage(void) INT
15、32 iPost; .; /program code iPost = MsgPost(.); / 发送消息 if (iPost = OK) .; /处理代码else .; /处理代码2.4.2 接口函数的输入参数(尤其是指针和数组下标)、非输入参数的合法性必须检查。说明:函数的输入主要有两种:一种是参数输入;另一种是非参数输入,包括全局变量、数据文件等,这些参数都需要作检查。示例:下函数的实现不符合规范。RESULT isdn_Receive(NI_CELL *pstCell,SK_BUF *pstSkBuf).; /接收数据代码return OK;应改作以下写法。RESULT isdn_Re
16、ceive(NI_CELL *pstCell,SK_BUF *pstSkBuf)if (pstCell = NULL) | (pstSkBuf = NULL) return FALSE;.; /接收数据代码return OK;2.4.3 禁止把函数的参数作为工作变量。说明:需要做改变的参数,应该先用局部变量代之,最后再将该局部变量的内容赋给该参数。示例:下函数的实现不符合规范。BOOLEAN isdn_SumData(WORD wNumber,WORD *pwData, WORD *pwSum) WORD wCount;if (pwData = NULL) | (pwSum = NULL) r
17、eturn FALSE; *pwSum = 0; for (wCount = 0; wCount wNumber; wCount+) *pwSum += pwDatawCount; / pwSum成了工作变量,不规范return TRUE;应改作以下写法。BOOLEAN isdn_SumData(WORD wNumber,WORD *pwData, WORD *pwSum) WORD wCount; WORD wSumTemp;if (pwData = NULL) | (pwSum = NULL) return FALSE; wSumTemp = 0; for (wCount = 0; wCount b ? a : b#define MAX(a,b) (a b ? a : b)#define MAX(a,b) (a) (b) ? (a) : (b)正确的定义应为:#define MAX(a,b) (a) (b) ? (a) : (b)2.4.7 将宏所定义的多条表达式放在大括号中。示例:下面的定义不规
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1