1. 程式人生 > >C語言的編碼規範

C語言的編碼規範


個人編碼模板

                c/c++語言程式設計模板

程式碼總體原則:

<1>清晰第一

  清晰性是易於維護,易於重構的程式必須具備的特徵。

<2>簡潔為美

  簡潔就是易於理解並且易於實現,廢棄的程式碼及時清除,重複的程式碼應該儘可能提煉成函式。

<3>選擇合適的風格,與程式碼原有的風格保持一致

  如果重構/修改其他風格 的程式碼時,比較明智的做法是根據現有程式碼的現有風格繼續編寫程式碼。

程式排版:

1.程式塊要採用縮排風格進行編寫,縮排的空格數為4.

2.較長的語句(>80字元)要分成多行書寫。

3.迴圈、判斷等語句中若有較長的表示式或者語句,則要進行適當的劃分,長表示式要在低優先順序操作符處劃分新行,操作符放在新行之首。

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

}

4.不允許把多個短語句寫在一行中,即一行只寫一條語句。如下則不符合規範。

Int a=0; int b=0;

5.If,for,do,while,case,switch,default語句自成一行時,則if,do,while,for語句等執行語句部分無論多少都要加括號{}

6.函式或過程的開始,結構的定義及迴圈和判斷等語句中的程式碼都要採用縮排風格,case語句下的情況處理語句也要遵從語句縮排要求。

註釋:

1.一般情況下,源程式有效註釋量必須在20%以上。

說明:註釋的原則是有助於對程式的閱讀理解,註釋不宜太多也不能太少,註釋語言必須準確、易懂、簡潔。

2.註釋的內容要清楚、明瞭,含義準確,防止註釋二義性。

說明:有歧義的註釋反而會導致維護者更難看懂程式碼,正如帶兩塊表反而不知道準確時間。

3.修改程式碼時,維護程式碼周邊的所有註釋,以保證註釋與程式碼的一致性。

說明:不再有用的註釋要刪 除。 說明:不要將無用的程式碼留在註釋中,隨時可以從原始碼配置庫中找回程式碼;即使只是想暫時排除代 碼,也要留個標註,不然可能會忘記處理它。

4.檔案頭部應進行註釋,註釋必須列出:版權說明、版本號、生成日期、作者姓名、工號、內 容、功能說明、與其它檔案的關係、修改日誌等,標頭檔案的註釋中還應有函式功能簡要說明。

說明:通常標頭檔案要對功能和用法作簡單說明,原始檔包含了更多的實現細節或演算法討論。 版權宣告格式:Copyright © Huawei Technologies Co., Ltd. 1998-2011. All rights reserved. 1998-2011根據實際需要可以修改, 1998是檔案首次建立年份,而2011是最新檔案修改年份。

示例:下面這段標頭檔案的頭註釋比較標準,當然,並不侷限於此格式,但上述資訊建議要包含在內。/*************************************************   Copyright © Huawei Technologies Co., Ltd. 1998-2011. All rights reserved.

File name:               // 檔名   

Author:  IDVersion: Date: // 作者、工號、版本及完成日期   

Description:    // 用於詳細說明此程式檔案完成的主要功能,與其他模組                   

// 或函式的介面,輸出值、取值範圍、含義及引數間的控                   // 制、順序、獨立或依賴等關係   

Others:         // 其它內容的說明   

History:        // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改                   

// 者及修改內容簡述

5.註釋應放在其程式碼上方相鄰位置或右方,不可放在下面。如放於上方則需與其上面的程式碼用 空行隔開,且與下方程式碼縮排相同。 示例:

/* active statistic task number */

#define MAX_ACT_TASK_NUMBER 1000  

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

可按如下形式說明列舉/資料/聯合結構。

 /* 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*/

}

6.避免在一行程式碼或表示式的中間插入註釋。

說明:除非必要,不應在程式碼或表達中間插入註釋,否則容易使程式碼可理解性變差。

7.在程式碼的功能、意圖層次上進行註釋,即註釋解釋程式碼難以直接表達的意圖,而不是重複描 述程式碼。

說明:註釋的目的是解釋程式碼的目的、功能和採用的方法,提供程式碼以外的資訊,幫助讀者理解程式碼, 防止沒必要的重複註釋資訊。對於實現程式碼中巧妙的、晦澀的、有趣的、重要的地方加以註釋。註釋不是為了名詞解釋(what),而是說明用途(why)。

示例:如下注釋純屬多餘。

++i; /* increment i */

if (receive_flag) /* if receive_flag is TRUE */

其他:

1.標頭檔案

1.1禁止標頭檔案迴圈依賴

1.2.c/.h檔案禁止包含用不到的標頭檔案

1.3禁止在標頭檔案中定義變數

2.函式

2.1一個函式僅完成一個功能

2.2 重複程式碼應該儘可能提煉成函式

  重複程式碼提煉成函式可以帶來維護成本的降低。

2.3廢棄程式碼(沒有被呼叫的函式和變數)要及時清除。

2.4 函式的引數個數不超過5

  函式的引數過多,會使得該函式易於受外部(其他部分的程式碼)變化的影響,從而影響維護工 作。函式的引數過多同時也會增大測試的工作量。

3.識別符號命名與定義

  通用命名規則

  單詞用小寫字母,每個單詞直接用下劃線_‟分割,例如text_mutex, kernel_text_address

  3.1 識別符號的命名要清晰、明瞭,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫, 避免使人產生誤解。好的命名:int error_number,不好的命名:使用隨意的字元。如int nerr

  3.2除了常見的通用縮寫以外,不使用單詞縮寫,不得使用漢語拼音。較長的單詞可取單詞的頭幾個字母形成縮寫,一些 單詞有大家公認的縮寫,常用單詞的縮寫必須統一。

舉例:argument 可縮寫為 arg

      clock 可縮寫為 clk

      configuration 可縮寫為 cfg

      maximum 可縮寫為 max

      minimum 可縮寫為 min

      temp 可縮寫為 tmp

3.3 用正確的反義片語命名具有互斥意義的變數或相反動作的函式等。

add/remove         begin/end          create/destroy

insert/delete   first/last    get/release increment/decrement    put/get          add/delete 

例項模板:

//檔名:順序表插入及求表長.cpp

//作者: Vector_山水之間

//學號:1508010333

//版本:20160506.1.0

//完成日期:2016.5.6

//主要功能:完成順序表的 插入和求表長的操作

#include<stdio.h>  
#define MAXSIZE 100  
typedef int ElemType;  
typedef struct            //定義順序表結構  
{  
<span style="white-space:pre">  </span>ElemType list[MAXSIZE];  
    int last;  
}SeqList;  
  
void InitList(SeqList *L)  //定義初始表的函式  
{  
    L->last=-1;  
}  
void PutseqList(SeqList *L,int n) //定義初始輸出函式  
{  
    int i;  
    for(i=0;i<n;i++)  
        scanf("%d",&(L->list[i]));  
    L->last=L->last+n;  
}  
int LengthList(SeqList *L)    //定義求表長的函式  
{  
<span style="white-space:pre">  </span>int Len;  
    Len=L->last+1;  
    return Len;  
}  
int PositionList(SeqList *L,int X)  //定義位置確認函式  
{  
    int j;  
    for(j=0;j<=L->last;j++)  
        if(X<L->list[j])  
        <span style="white-space:pre">  </span>return j+1;  
    return (L->last+2);  
}  
int InsertList(SeqList *L,int i,int e) //定義插入函式  
{  
    int k;  
    if((i<1)||(i>L->last+1))  
    {  
        printf("插入位置不合理");  
        return 0;  
    }  
    if(L->last>=MAXSIZE-1)  
    {  
        printf("表已滿無法插入");\  
        return 0;  
    }  
    for(k=L->last;k>=i-1;k--)  
        L->list[k+1]=L->list[k];  
    L->list[i-1]=e;  
    L->last++;  
        return 1;     
}  
//定義經過插入操作後的輸出函式  
int OutputSeqList(SeqList *L) //定義經過插入操作後的輸出函式函式  
{  
    int i;  
    printf("輸出結果為:");  
    for(i=0;i<=L->last;i++)  
        printf("%d ",L->list[i]);  
    return(L->list[i]);   
}  
int main()                     //主函式  
{  
    int s,c;  
    SeqList L;  
    InitList(&L);  
    printf("請輸入順序表長度:");  
    scanf("%d",&s);  
    printf("請輸入遞增順序表:");  
    PutseqList(&L,s);  
    LengthList(&L);  
    printf("表長為%d\n",LengthList(&L));  
    printf("請輸入要插入的元素:");  
    scanf("%d",&c);  
    InsertList(&L,PositionList(&L,c),c);  
    OutputSeqList(&L);  
    printf("\n");  
    return 0;  
}