華為軟件編程規(guī)范_第1頁
華為軟件編程規(guī)范_第2頁
華為軟件編程規(guī)范_第3頁
華為軟件編程規(guī)范_第4頁
華為軟件編程規(guī)范_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、文檔編號產(chǎn)品版本受控狀態(tài)DC-SB-2003-1005V 1.0內(nèi)部產(chǎn)品名稱:軟件編程規(guī)范共頁軟件編程規(guī)范(僅供內(nèi)部使用)北京世紀(jì)百合科技有限公司Beijing Centurial Lily Technology Co.,Ltd.版權(quán)所有不得復(fù)制文檔修改記錄版本號日期所改頁注記提交人批準(zhǔn)人1.引言.1.1目的.41.2范圍.2.規(guī)范.2.1文件.2.2版面風(fēng)格.2.3標(biāo)識符命名.2.4函數(shù)與宏.2.5代碼的可靠性.錯(cuò)誤!未定義書簽。3.附錄:通用類型的公共定義.1.引言1.1 目的本規(guī)范的目的在于增加源代碼的可讀性,減少程序員對代碼理解上的偏 差,使程序員能夠編寫出可靠的代碼,降低代碼維護(hù)成本

2、。1.2 范圍本規(guī)范內(nèi)容涉及范圍包括:文件、版面、注釋、標(biāo)識符、變量和結(jié)構(gòu)、 函數(shù)、宏以及可理解性等。 本規(guī)范適用于公司開發(fā)的所有軟件產(chǎn)品。 在新 軟件的編碼過程中本規(guī)范必須執(zhí)行。2.規(guī)范2.1 文件2.5.3頭文件的名稱一律為小寫,格式為“子系統(tǒng)名_文件名.h”。例如:ipf_protocol.h等。2.1.2頭文件的格式如下:注釋頭,格式參見軟件編程規(guī)范; 頭文件預(yù)編譯開關(guān)開始,格式為:#ifndef預(yù)編譯開關(guān)#define預(yù)編譯開關(guān)其中預(yù)編譯開關(guān)格式為:“_文件名_H,其中文件名一律大寫頭文件內(nèi)容; 頭文件預(yù)編譯開關(guān)結(jié)束,格式為:#endif用來和頭文件預(yù)編譯開關(guān)的開始對應(yīng)。例如:以下為

3、ipf_ip.h頭文件的內(nèi)容:/*#ifndef _IPF_IP_H #define _IPF_IP_HDescription:/用于詳細(xì)說明此程序文件完成的主要功能Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVED*#endif2.5.9頭文件的定義要有層次,禁止交叉引用。說明:頭文件的層次設(shè)置為公共模塊、私有模塊。頭文件的引用次序?yàn)橄聦宇^文件 引用上層頭文件、 私有頭文件引用公共頭文件, 聲明結(jié)構(gòu)時(shí)尤其要注意, 不允許出 現(xiàn)交叉引用的情況。示例:如下定義不符合規(guī)范頭文件isdn_a.h/*Cop

4、yright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescription:定義配置數(shù)據(jù)結(jié)構(gòu)*/#ifndef _ISDN_A_H#define _ISDN_A_H#include“isdn_b.h”typedef structISDN_CONTROL stIsdnControl;ISDN_ CONFIG;#endif頭文件isdn_b.h/*Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescriptio

5、n:定義控制數(shù)據(jù)結(jié)構(gòu)*#ifndef _ISDN_B_H#define _ISDN_B_H #include“isdn_a.htypedef structISDN_CONFIG stIsdnConfig;ISDN_CONTROL;#endif為了解決上述矛盾,可以將兩個(gè)結(jié)構(gòu)合并到一個(gè)文件中聲明。2.5.10文件中如果引用系統(tǒng)頭文件,必須使用“;如果引用自定義的頭文件,必須使用“”“和“”“。說明:系統(tǒng)頭文件是指由編譯系統(tǒng)提供的頭文件。 示例:如下書寫不符合規(guī)范。#include“stdlib.h”#include 應(yīng)該改作:#include #include“isdn_config.h”2.5

6、.11頭文件中只能聲明變量類型,禁止定義變量。說明:如果在頭文件中定義變量,當(dāng)有多個(gè)源文件引用該頭文件時(shí),會(huì)出現(xiàn)重復(fù)定 義的錯(cuò)誤。示例:如下頭文件是不規(guī)范的。頭文件isdn_a.h/*Copyright (c) Lily Of The Century Technology Co., LTD.ALL RIGHTS RESERVEDDescription:定義配置數(shù)據(jù)結(jié)構(gòu)*/#ifndef _ISDN_A_H#define _ISDN_A_Htypedef structISDN_ CONFIG;ISDN_CONFIG g_stIsdnConfig;#endif結(jié)構(gòu)變量g_stIsdnConfig不

7、能在頭文件中定義,只能在源文件中定義。可 以在相應(yīng)的源文件定義后,頭文件作如下改動(dòng):ISDN_CONFIG g_stIsdnConfig;改為extern ISDN_CONFIG g_stIsdnConfig;2.5.12頭文件的聲明順序,應(yīng)該有層次感。說明:頭文件的聲明順序一般是宏、結(jié)構(gòu)、函數(shù)、變量。函數(shù)在頭文件中聲明時(shí)開 頭可以不加“extern”2.5.13源文件名稱一律小寫,格式為:子系統(tǒng)名_文件名.c,示例:ipf_ pkt.c表示在IPF子系統(tǒng)的包處理文件。2.1.8源文件必須加注釋頭。源文件注釋頭格式為:/*Copyright (c) Lily Of The Century Te

8、chnology Co.,LTD.ALL RIGHTS RESERVEDDescription: /用于詳細(xì)說明此程序文件完成的主要功能*/2.2版面風(fēng)格221程序塊采用縮進(jìn)風(fēng)格編寫,縮進(jìn)使用TAB符號,TAB符號規(guī)定為4個(gè)空格。變量說明之后必須加空行。說明:由開發(fā)工具自動(dòng)生成的代碼例外 示例:如下例子不符合規(guī)范。void isdn_InitConfig(void)WORD wConfigNumner;.; /program code應(yīng)如下書寫void isdn_InitConfig(void)WORD wConfigNumner;.; /program code不允許把多個(gè)短語句寫在一行中,

9、一行只寫一條語句示例:如下例子不符合規(guī)范。wLength = wWidth = 0;或wLength = 0, wWidth = 0;應(yīng)如下書寫wLength = 0; wWidth = 0;禁止如下寫法:int i = j = 0;或int i = 0,j = 0;應(yīng)該寫作:int i =0; int j = 0;或int i,j; i = 0; j = 0;do、while、switch、case、default、if、else、for等語句自占 一行,且if、else語句在同一列。示例1:如下例子不符合規(guī)范。do .; /program code while (pstUser != NU

10、LL);應(yīng)如下書寫:do.; /program code while (pstUser != NULL);示例2:如下例子不符合規(guī)范。while (pstUser != NULL) .; /program code應(yīng)如下書寫:while (pstUser != NULL).; /program code示例3:如下例子不符合規(guī)范。switch (dwCounter) case 1: dwCounter+;.; /program codebreak; default:break;應(yīng)如下書寫:switch (dwCounter)case 1:dwCounter+;.; /program code

11、break;default:break;示例4:如下例子不符合規(guī)范。if (pstUser = NULL) return;else .; /program code應(yīng)如下書寫:if (pstUser = NULL)return;else.; /program code示例5:如下例子不符合規(guī)范。for (i = 0;i 10;i+) .; /program code應(yīng)如下書寫:for (i = 0;i 4) & OxFO)2.3.3函數(shù)的命名為:前綴+下劃線+字符串。其中前綴為全小寫的子系統(tǒng) 名稱,字符串由一個(gè)或多個(gè)單詞組成,每個(gè)單詞首字母大寫,其他 字母小寫。示例:void MsgCreat

12、e(void);void icmp_PktRecv(void);調(diào)試用的編譯開關(guān)是開頭為下劃線的全大寫字符串, 具體格式是: 下劃線+DEBUG子系統(tǒng)名稱+下劃線+名稱。示例:_DEBUG_IPF_IP_PACKET_DEBUG_TCP_OPTI等N結(jié)構(gòu)聯(lián)合類型命名規(guī)則為:子系統(tǒng)名稱+下劃線+結(jié)構(gòu)名稱、子系統(tǒng)名稱+下劃線+聯(lián)合名稱,其中所有字母大寫。示例:typedef structIP_TRACEROUTE;typedef unionICMP_PKT ;全局變量命名的具體格式是:前綴+下劃線+子系統(tǒng)名+下劃線+字符串,其中前綴為小寫的“g”,子系統(tǒng)名稱全部小寫,字符串由一個(gè) 或多個(gè)單詞組成,

13、每個(gè)單詞首字母大寫,其他字母小寫。示例:g_icmp_TraceRouteQueue、g_ospf_InterfList等。消息宏定義的采用一下格式:前綴+下劃線+字符串+下劃線+后綴。其中前綴采用小寫的“mm”,字符串標(biāo)記消息宏的具體含義,由一 個(gè)或多個(gè)單詞組成,每個(gè)單詞首字母大寫,其他字母小寫,后綴為XXXtoYYY表示消息的傳送方向,XXX表示源子系統(tǒng)名,YYY為目的子系統(tǒng)名,全部用大寫字母表示。示例:mm_AddRoute_BGPtoRTMGE示從BGP協(xié)議發(fā)送到路由管理實(shí)體的增加一條路 由的消息,mm_ShowIpRoute_CLItoRTMG表示從CLI發(fā)送到路由管理子系統(tǒng)的要求

14、顯示路由表的消息。2.4 函數(shù)與宏對函數(shù)的返回值要仔細(xì)、全面地處理。說明:對提供返回值的函數(shù),尤其是接口函數(shù),其返回值必須檢查。示例:以下函數(shù)是不規(guī)范的。void isdn_SendMessage(void).; /program codeMsgPost(.); /發(fā)送消息應(yīng)該改作void isdn_SendMessage(void)INT32 iPost;.; /program codeiPost = MsgPost(.); /發(fā)送消息if (iPost = OK).; /處理代碼else.; /處理代碼接口函數(shù)的輸入?yún)?shù)(尤其是指針和數(shù)組下標(biāo))、非輸入?yún)?shù)的合 法性必須檢查。說明:函數(shù)的輸

15、入主要有兩種:一種是參數(shù)輸入;另一種是非參數(shù)輸入,包括全局 變量、數(shù)據(jù)文件等,這些參數(shù)都需要作檢查。示例:下函數(shù)的實(shí)現(xiàn)不符合規(guī)范。RESULT isdn_Receive(NI_CELL *pstCell,SK_BUF *pstSkBuf).; /接收數(shù)據(jù)代碼return OK;應(yīng)改作以下寫法。RESULT isdn_Receive(NI_CELL *pstCell,SK_BUF *pstSkBuf)if (pstCell = NULL) | (pstSkBuf = NULL)return FALSE;.; /接收數(shù)據(jù)代碼return OK;禁止把函數(shù)的參數(shù)作為工作變量。說明:需要做改變的參數(shù),

16、應(yīng)該先用局部變量代之,最后再將該局部變量的內(nèi)容賦 給該參數(shù)。示例:下函數(shù)的實(shí)現(xiàn)不符合規(guī)范。BOOLEAN isdn_SumData(WORD wNumber,WORD *pwData, WORD *pwSum)WORD wCount;if (pwData = NULL) | (pwSum = NULL)return FALSE;*pwSum = 0;for (wCount = 0; wCount wNumber; wCount+)*pwSum += pwDatawCount; / pwSum成了工作變量,不規(guī)范return TRUE;應(yīng)改作以下寫法。BOOLEAN isdn_SumData(W

17、ORD 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)正確的定義應(yīng)為:#define MAX(a,b) (a) (b) ? (a) : (b)void。將宏所定義的多條表達(dá)式放在大括號中示例:下面的定義不規(guī)

18、范#define ISDN_INIT_VALUE(a, b) a = 0;b = 0;正確的用法應(yīng)為:#define ISDN_INIT_VALUE(a, b) a = 0;b = 0;使用宏時(shí),不允許參數(shù)發(fā)生變化。示例:如下用法導(dǎo)致錯(cuò)誤。#define MAX(a, b) (a) (b) ? (a) : (b) iResult = MAX(iRx+,iTx);將被預(yù)處理器解釋為iResult =(iRx+) (iTx) ? (iRx+) : (iTx);此時(shí)如果輸入iRx = 6; iTx = 5;代碼執(zhí)行結(jié)果iResult = 7,此時(shí)iRx為8應(yīng)該改作如下用法:iResult = MAX

19、(iRx,iTx); iRx+;2.5 代碼的可靠性2.5.1系統(tǒng)運(yùn)行之初, 要初始化所有本系統(tǒng)的全局變量, 禁止未經(jīng)初始化 的全局變量被引用。說明:使用未初始化的數(shù)據(jù),容易使系統(tǒng)進(jìn)入混亂狀態(tài)。示例:以下的全局變量如果沒有在系統(tǒng)運(yùn)行時(shí)初始化,在被函數(shù)使用時(shí)會(huì) 出錯(cuò)ISDN_CELL *g_pstIsdnCellISDN_MAX_CELL_NUM;void isdn_ShowChannel(WORD wSlot,WORD wPort)ISDN_CELL *pstIsdnCell = 0;int i;for (i = 0; i wSlot = wSlot) & (pstIsdnCell-wPort

20、 = wPort)break;.; /other program code2.5.2申請內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL?(防止使用指針值為NULL的內(nèi)存)說明:申請內(nèi)存時(shí),如果申請失敗,應(yīng)該避免使用該指針。必須使用if (p = NULL)或if (p != NULL)進(jìn)行防錯(cuò)處理。50fec-Numbered_2b0b4b84-74ce-48c4-9269-5613134bdeec- 禁止將未被初始化的內(nèi)存作為零值使用。說明:創(chuàng)建的數(shù)組或動(dòng)態(tài)申請的內(nèi)存,其初始值是不確定的,不能當(dāng)作零 處理。示例:以下代碼是不規(guī)范的。void isdn_CheckIe(BYTE *pbyIe,WO

21、RD wIeLen)WORD wTempLen;/wTempLen未初始化,其初始值不一定為0while(wTempLen wIeLen).; /other program codewTempLen += 2;應(yīng)作如下改寫:void isdn_CheckIe(BYTE *pbyIe,WORD wIeLen)WORD wTempLen;wTempLen = 0;while (wTempLen MAX_LENGTH)return LENGTH_ERROR; /忘了釋放pbyBuf.; / other program code應(yīng)改為如下。int ExampleFunction(BYTE byLen)

22、BYTE *pbyBuf;pbyBuf = (BYTE *)malloc(MAX_LENGTH);.; /program code, include check pBuf if or not NULLif (byLen MAX_LENGTH)free(pBuf); /退出之前釋放pbyBufreturn LENGTH_ERROR;.; / other program code2.5.7在switch的處理程序塊中,必須有default語句;并且每個(gè)case語句都要有對應(yīng)的break。說明:如果一個(gè)case下的處理語句需要調(diào)用下一個(gè)case的處理語句,可 以將下一個(gè)case的處理語句copy過來

23、。示例:以下寫法是不規(guī)范的switch (wEvent)case 1:isdn_SendEvent(wEvent);case 2:wEvent+;break;default:break;應(yīng)該改為:switch (wEvent)case 1: isdn_SendEvent(wEvent);wEvent+;break;case 2:wEvent+;break;default:break;2.5.8不要濫用goto語句。說明:goto語句會(huì)破壞程序的結(jié)構(gòu)性,除非確實(shí)需要,不要使用goto語 句。 一甀洀戀攀爀攀攙開 攀挀 愀攙 愀挀 挀攙愀 一甀洀戀攀爀攀攙開愀 挀昀 愀 昀 愀愀挀愀愀 一甀洀%2

24、5089 攀爀攀攙開戀愀昀 挀昀 戀愀 挀 戀攀攙攙戀昀心程序機(jī)器碼大小(如指令空間大小、數(shù)據(jù)空間大小、堆??臻g 大小等)是否超出系統(tǒng)有關(guān)限制。 一甀洀戀攀爀攀攙開 攀挀 愀攙 愀挀 挀攙愀 一甀洀戀攀爀攀攙開愀 挀昀 愀 昀 愀愀挀愀愀 一甀洀%25089 攀爀攀攙開戀愀昀 挀昀 戀愀 挀 戀攀攙攙戀昀用顯式的數(shù)據(jù)類型轉(zhuǎn)換,避免讓編譯器進(jìn)行隱式的數(shù)據(jù)類型轉(zhuǎn) 換。說明:使用顯示的數(shù)據(jù)轉(zhuǎn)換一方面增加可讀性,有利于代碼的維護(hù);另一方面避免 隱式的數(shù)據(jù)類型轉(zhuǎn)換引起的編譯告警。示例:以下的書寫不符合規(guī)范NI_CELL *isdn_Load(void)NI_CELL *pstNiCell;pstNiCell = malloc(sizeof(NI_CELL);.; /pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論