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: ID:Version: 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;
}