❶ c語言代碼編寫的格式
C語言 程序代碼編寫規范
(初級程序員 討論版)
前言
一個好的程序編寫規范是編寫高質量程序的保證。清晰、規范的源程序不僅僅是方便閱讀,更重要的是能夠便於檢查錯誤,提高調試效率,從而最終保證軟體的質量和可維護性。
說明
l 本文檔主要適用於剛剛開始接觸編程的初學者。
l 對於具有一定工程項目開發經驗的程序員,建議學習C語言程序代碼編寫規范—高級版。
目錄
1 代碼書寫規范
2 注釋書寫規范
3 命名規范
4 其它一些小技巧和要求
1 代碼書寫規范
1.1函數定義
花括弧: { }
每個函數的定義和說明應該從第1列開始書寫。函數名(包括參數表)和函數體的花括弧應該各佔一行。在函數體結尾的括弧後面可以加上注釋,注釋中應該包括函數名,這樣比較方便進行括弧配對檢查,也可以清晰地看出來函數是否結束。
範例1:函數的聲明
void matMyFunction(int n)
{
……
} /* matMyFunction*/
1.2空格與空行的使用
要加空格的場合
l 在逗號後面和語句中間的分號後面加空格,如:
int i, j, k;
for (i = 0; i < n; i++)
result = func(a, b, c);
l 在二目運算符的兩邊各留一個空格,如
a > b a <= b i = 0
l 關鍵字兩側,如if () …, 不要寫成if() …
l 類型與指針說明符之間一定要加空格:
char *szName;
不加空格的場合
l 在結構成員引用符號.和->左右兩加不加空格:
pStud->szName, Student.nID
l 不在行尾添加空格或Tab
l 函數名與左括弧之間不加空格:
func(…)
l 指針說明符號*與變數名間不要加空格:
int *pInt; 不要寫成: int * pInt;
l 復合運算符中間不能加空格,否則會產生語法錯誤,如:
a + = b a < = b 都是錯誤的
空行與換行
l 函數的變數說明與執行語句之間加上空行;
l 每個函數內的主要功能塊之間加空行表示區隔;
l 不要在一行中寫多條語句.
範例2:空行與換行
int main()
{
int i, j, nSum = 0; //變數說明
for (i = 0; i < 10; i++) //執行代碼
{
for (j = 0; j < 10; j++)
{
nSum += i;
}
}
}
1.3縮進的設置
根據語句間的層次關系採用縮進格式書寫程序,每進一層,往後縮進一層
有兩種縮進方式:1,使用Tab鍵;2,採用4個空格。
整個文件內部應該統一,不要混用Tab鍵和4個空格,因為不同的編輯器對Tab鍵的處理方法不同。
1.4折行的使用
· 每行的長度不要超過80個字元,當程序行太長時,應該分行書寫。
· 當需要把一個程序行的內容分成幾行寫時,操作符號應該放在行末。
· 分行時應該按照自然的邏輯關系進行,例如:不要把一個簡單的邏輯判斷寫在兩行上。
· 分行後的縮進應該按照程序的邏輯關系進行對齊。例如:參數表折行後,下面的行應該在參數表左括弧的下方。
範例2:折行的格式
dwNewShape = matAffineTransform(coords, translation,
rotation);
if (((new_shape.x > left_border) &&
(new_shape.x < right_border)) &&
((new_shape.y > bottom_border) &&
(new_shape.y < top_border)))
{
draw(new_shape);
}
1.5嵌套語句(語句塊)的格式
對於嵌套式的語句--即語句塊(如,if、while、for、switch等)應該包括在花括弧中。花括弧的左括弧應該單獨佔一行,並與關鍵字對齊。建議即使語句塊中只有一條語句,也應該使用花括弧包括,這樣可以使程序結構更清晰,也可以避免出錯。建議對比較長的塊,在末尾的花括弧後加上注釋以表明該語言塊結束。
範例3:嵌套語句格式
if (value < max)
{
if (value != 0)
{
func(value);
}
}
} else {
error("The value is too big.");
} /* if (value < max) */
2 注釋書寫規范
注釋必須做到清晰,准確地描述內容。對於程序中復雜的部分必須有注釋加以說明。注釋量要適中,過多或過少都易導致閱讀困難。
2.1注釋風格
· C語言中使用一組(/* … */)作為注釋界定符。
· 注釋內容盡量用英語方式表述。
· 注釋的基本樣式參考範例4。
· 注釋應該出現在要說明的內容之前,而不應該出現在其後。
· 除了說明變數的用途和語言塊末尾使用的注釋,盡量不使用行末的注釋方式。
範例4:幾種注釋樣式
/*
* ************************************************
* 強調注釋
* ************************************************
*/
/*
* 塊注釋
*/
/* 單行注釋 */
//單行注釋
int i; /*行末注釋*/
2.2何時需要注釋
· 如果變數的名字不能完全說明其用途,應該使用注釋加以說明。
· 如果為了提高性能而使某些代碼變得難懂,應該使用注釋加以說明。
· 對於一個比較長的程序段落,應該加註釋予以說明。如果設計文檔中有流程圖,則程序中對應的位置應該加註釋予以說明。
· 如果程序中使用了某個復雜的演算法,建議註明其出處。
· 如果在調試中發現某段落容易出現錯誤,應該註明。
3 命名規范
3.1常量、變數命名
l 符號常量的命名用大寫字母表示。如:
#define LENGTH 10
l 如果符號常量由多個單詞構成,兩個不同的單詞之間可以用下劃線連接。如:
#define MAX_LEN 50
變數命名的基本原則:
l 可以選擇有意義的英文(小寫字母)組成變數名,使人看到該變數就能大致清楚其含義。
l 不要使用人名、地名和漢語拼音。
l 如果使用縮寫,應該使用那些約定俗成的,而不是自己編造的。
l 多個單片語成的變數名,除第一個單詞外的其他單詞首字母應該大寫。如:
dwUserInputValue。
3.2函數命名
函數命名原則與變數命名原則基本相同。對於初學者,函數命名可以採用「FunctionName」的形式。
4 其它一些小技巧和要求
l 函數一般情況下應該少於100行
l 函數定義一定要包含返回類型,沒有返回類型加void
l 寫比較表達式時,將常量放在左邊
10 == n
NULL != pInt
l 指針變數總是要初始或重置為NULL
l 使用{}包含復合語句,即使是只有一行,如:
if (1 == a)
{
x = 5;
}
http://home.ustc.e.cn/~danewang/c/CodingStandards.html
❷ C語言程序注釋
C語言編程規范-注釋
規則:
1:一般情況下,源程序有效注釋量必須在20%以上。
說明:注釋的原則是有助於對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須准確、易懂、簡潔。
2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它文件的關系、修改日誌等,頭文件的注釋中還應有函數功能簡要說明。
示例:下面這段頭文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/*************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
File name: // 文件名
Author:
Version:
Date: // 作者、版本及完成日期
Description: // 用於詳細說明此程序文件完成的主要功能,與其他模塊
// 或函數的介面,輸出值、取值范圍、含義及參數間的控
// 制、順序、獨立或依賴等關系
Others: // 其它內容的說明
Function List: // 主要函數列表,每條記錄應包括函數名及功能簡要說明
1. ....
History: // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改
// 者及修改內容簡述
1. Date:
Author:
Modification:
2. ...
*************************************************/
3:源文件頭部應進行注釋,列出:版權說明、版本號、生成日期、作者、模塊目的/功能、主要函數及其功能、修改日誌等。
示例:下面這段源文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/************************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
FileName: test.cpp
Author:
Version :
Date:
Description: // 模塊描述
Version: // 版本信息
Function List: // 主要函數及其功能
1. -------
History: // 歷史修改記錄
<author> <time> <version > <desc>
David 96/10/12 1.0 build this moudle
***********************************************************/
說明:Description一項描述本文件的內容、功能、內部各部分之間的關系及本文件與其它文件關系等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。
4:函數頭部應進行注釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值、調用關系(函數、表)等。
示例:下面這段函數的注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/*************************************************
Function: // 函數名稱
Description: // 函數功能、性能等的描述
Calls: // 被本函數調用的函數清單
Called By: // 調用本函數的函數清單
Table Accessed: // 被訪問的表(此項僅對於牽扯到資料庫操作的程序)
Table Updated: // 被修改的表(此項僅對於牽扯到資料庫操作的程序)
Input: // 輸入參數說明,包括每個參數的作
// 用、取值說明及參數間關系。
Output: // 對輸出參數的說明。
Return: // 函數返回值的說明
Others: // 其它說明
*************************************************/
5:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。
6:注釋的內容要清楚、明了,含義准確,防止注釋二義性。
說明:錯誤的注釋不但無益反而有害。
7:避免在注釋中使用縮寫,特別是非常用縮寫。
說明:在使用縮寫時或之前,應對縮寫進行必要的說明。
8:注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放於上方則需與其上面的代碼用空行隔開。
示例:如下例子不符合規范。
例1:
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
例2:
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
/* get replicate sub system index and net indicator */
應如下書寫
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
9:對於所有有物理含義的變數、常量,如果其命名不是充分自注釋的,在聲明時都必須加以注釋,說明其物理含義。變數、常量、宏的注釋應放在其上方相鄰位置或右方。
示例:
/* active statistic task number */
#define MAX_ACT_TASK_NUMBER 1000
#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */
10:數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋放在此域的右方。
示例:可按如下形式說明枚舉/數據/聯合結構。
/* 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*/
};
11:全局變數要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它以及存取時注意事項等的說明。
示例:
/* The ErrorCode when SCCP translate */
/* Global Title failure, as follows */ // 變數作用、含義
/* 0 - SUCCESS 1 - GT Table error */
/* 2 - GT error Others - no use */ // 變數取值范圍
/* only function SCCPTranslate() in */
/* this moal can modify it, and other */
/* mole can visit it through call */
/* the function GetGTTransErrorCode() */ // 使用方法
BYTE g_GTTranErrorCode;
12:注釋與所描述內容進行同樣的縮排。
說明:可使程序排版整齊,並方便注釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
應改為如下布局。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
13:將注釋與其上面的代碼用空行隔開。
示例:如下例子,顯得代碼過於緊湊。
/* code one comments */
program code one
/* code two comments */
program code two
應如下書寫
/* code one comments */
program code one
/* code two comments */
program code two
14:對變數的定義和分支語句(條件分支、循環語句等)必須編寫注釋。
說明:這些語句往往是程序實現某一特定功能的關鍵,對於維護人員來說,良好的注釋幫助更好的理解程序,有時甚至優於看設計文檔。
15:對於switch語句下的case語句,如果因為特殊情況需要處理完一個case後進入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。
說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。
示例(注意斜體加粗部分):
case CMD_UP:
ProcessUp();
break;
case CMD_DOWN:
ProcessDown();
break;
case CMD_FWD:
ProcessFwd();
if (...)
{
...
break;
}
else
{
ProcessCFW_B(); // now jump into case CMD_A
}
case CMD_A:
ProcessA();
break;
case CMD_B:
ProcessB();
break;
case CMD_C:
ProcessC();
break;
case CMD_D:
ProcessD();
break;
...
建議:
1:避免在一行代碼或表達式的中間插入注釋。
說明:除非必要,不應在代碼或表達中間插入注釋,否則容易使代碼可理解性變差。
2:通過對函數或過程、變數、結構等正確的命名以及合理地組織代碼的結構,使代碼成為自注釋的。
說明:清晰准確的函數、變數等的命名,可增加代碼可讀性,並減少不必要的注釋。
3:在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。
說明:注釋的目的是解釋代碼的目的、功能和採用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復注釋信息。
示例:如下注釋意義不大。
/* if receive_flag is TRUE */
if (receive_flag)
而如下的注釋則給出了額外有用的信息。
/* if mtp receive a message from links */
if (receive_flag)
4:在程序塊的結束行右方加註釋標記,以表明某程序塊的結束。
說明:當代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便於閱讀。
示例:參見如下例子。
if (...)
{
// program code
while (index < MAX_INDEX)
{
// program code
} /* end of while (index < MAX_INDEX) */ // 指明該條while語句結束
} /* end of if (...)*/ // 指明是哪條if語句結束
5:注釋格式盡量統一,建議使用"/* …… */"。
6:注釋應考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利准確的英文表達。
說明:注釋語言不統一,影響程序易讀性和外觀排版,出於對維護人員的考慮,建議使用中文。
❸ 有誰知道C語言程序的編程規范,給我概括一下,
1引言
1.1編寫目的
在軟體開發過程中,編碼的工作量是相當大的,同一項目參與編程的人可能有各自編程的經驗和習慣,不同風格的程序代碼使維護工作變得復雜和困難。為了提高代碼的可讀性、系統的穩定性及降低維護和升級的成本,特編寫本規范以統一各開發人員的編程工作。
1.2 適用對象
本規范適用於所有開發人員,包括應用程序、網頁及資料庫開發人員,及有關的程序測試人員。
1.3 引用標准
GB/T 11457 軟體工程術語
GB 8566 計算機軟體開發規范
GB 8567 計算機軟體產品開發文件編制指南
2.編寫要求
2.1一般代碼規則
可讀性原則,這是評價程序質量的首選指標,寧可不要一些技巧也要保證程序的易讀特性,不要因過分追求技巧而犧牲程序的可讀性。
功能獨立性原則。每一程序塊只完成一個獨立的功能,反過來,每一獨立的功能只在一程序塊內完成,盡量低耦合、高內聚。
提示說明應當簡短且避免產生歧義。
提示或警告信息應當具有向導性,能准確告訴用戶錯誤原因及恢復方法。提示和警告對話框應當使用標准規范。
快捷鍵的定義必須符合用戶操作習慣。
程序需要長時間處理或等待時,應當顯示進度條並提示用戶等待。
一些敏感操作,如刪除等操作在執行前必須提示用戶確認。
2.2變數、函數、過程、控制項等命名規則
2.2.1 變數命名
變數命名採用[作用范圍][數據類型][自定義名稱]規則定義,並遵循匈牙利命名法。要求看到變數名就能直觀的看出其范圍和數據類型。
匈牙利命名規則:
a Array 數組
b BOOL (int) 布爾(整數)
by Unsigned Char (Byte) 無符號字元(位元組)
c Char 字元(位元組)
cb Count of bytes 位元組數
cr Color reference value 顏色(參考)值
cx Count of x (Short) x的集合(短整數)
dw DWORD (unsigned long) 雙字(無符號長整數)
f Flags (usually multiple bit values) 標志(一般是有多位的數值)
fn Function 函數
g_ global 全局的
h Handle 句柄
i Integer 整數
l Long 長整數
lp Long pointer 長指針
m_ Data member of a class 一個類的數據成員
n Short int 短整數
p Pointer 指針
s String 字元串
sz Zero terminated String 以0結尾的字元串
tm Text metric 文本規則
u Unsigned int 無符號整數
ul Unsigned long (ULONG) 無符號長整數
w WORD (unsigned short) 無符號短整數
x,y x, y coordinates (short) 坐標值/短整數
v void 空
作用范圍:
范圍 前綴 例子
全局作用域 g_ g_Servers
成員變數 m_ m_pDoc
局部作用域 無 strName
數據類型
VC常用前綴列表
前綴 類型 描述 例子
ch char 8位字元 chGrade
ch TCHAR 16位UNICODE類型字元 chName
b BOOL 布爾變數 bEnabled
n int 整型(其大小由操作系統決定) nLength
n UINT 無符號整型(其大小由操作系統決定) nLength
w WORD 16位無符號整型 wPos
l LONG 32位有符號整型 lOffset
dw DWORD 32位無符號整型 dwRange
p * 內存模塊指針,指針變數 pDoc
l p FAR* 長指針 lpDoc
lpsz LPSTR 32位字元串指針 lpszName
lpsz LPCSTR 32位常量字元串指針 lpszName
lpsz LPCTSTR 32位UNICODE類型常量指針 lpszName
h handle Windows對象句柄 hWnd
lpfn (*fn)() 回調函數指針 Callback Far pointer to
CALLBACK function lpfnAbort
2.2.2 函數、過程命名
函數或過程名的主體應該使用大小寫混合形式,並且應該足夠長以描述它的作用。而且,函數名應該以一個動詞起首,如 InitNameArray 或 CloseDialog。對於頻繁使用的或長的項,推薦使用標准縮略語以使名稱的長度合理化。一般來說,超過 32 個字元的變數名在 VGA 顯示器上讀起來就困難了。當使用縮略語時,要確保它們在整個應用程序中的一致性。在一個工程中,如果一會兒使用 Cnt, 一會兒使用 Count,將導致不必要的混淆。
對於自行編寫的函數,若是系統關鍵函數,則須在函數實現部分的上方標明該函數的信息,格式如下:
//======================================================
// 函 數 名:InsureHasOutputInfo
// 功能描述:確保有適當的輸出信息
// 輸入參數:nProctID:相應的產品ID
// 輸出參數:void
// 創建日期:00-2-21
// 修改日期:00-2-21
// 作 者:***
// 附加說明:
//======================================================
2.2.3 用戶定義類型
在一項有許多用戶定義類型的大工程中,常常有必要給每種類型一個它自己的三個字元的前綴。如果這些前綴是以 "u" 開始的,那麼當用一個用戶定義類型來工作時,快速識別這些類型是很容易的。例如,ucli 可以被用來作為一個用戶定義的客戶類型變數的前綴。
註:對於非通用的變數,請在定義時加以注釋說明,變數定義盡可能放在最開始處。
2.2.4 控制項命名
應該用一致的前綴來命名對象,使人們容易識別對象的類型。
VC常用宏定義命名列表
前綴 符號類型 符號例子 范圍
IDR_ 標識多個資源共享的類型 IDR_MAINFRAME 1~0x6FFF
IDD_ 對話框資源(Dialog) IDD_SPELL_CHECK 1~ 0x6FFF
HIDD_ 基於對話框的上下文幫助 HIDD_SPELL_CHECK 0x20001~0x26FF
IDB_ 點陣圖資源(Bitmap) IDB_COMPANY_LOGO 1~0x6FFF
IDC_ 游標資源(Cursor) IDC_PENCIL 1~0x6FFF
IDI_ 圖標資源(Icon) IDI_NOTEPAD 1~0x6FFF
ID_、IDM_ 工具欄或菜單欄的命令項 ID_TOOLS_SPELLING 0x8000~0xDFFF
HID_ 命令上下文幫助 HID_TOOLS_SPELLING 0x18000~0x1DFFF
IDP_ 消息框提示文字資源 IDP_INVALID_PARTNO 8~0xDFFF
HIDP_ 消息框上下文幫助 HIDP_INVALID_PARTNO 0x30008~0x3DFFF
IDS_ 字元串資源(String) IDS_COPYRIGHT 1~0x7FFF
IDC_ 對話框內的控制資源 IDC_RECALC 8~0xDFFF
2.3源代碼規則
2.3.1風格約定:採用縮進的格式保存程序的層次結構。要求能直觀的看出循環、判斷等層次結構。
每一個嵌套的函數塊,使用一個TAB縮進(可以設定為4個空格),大括弧必須放在條件語句的下一行,單獨成一行,便於匹對反大括弧應該在單獨的一行,在大多數情況下反擴號應有注釋內容。舉例如下:
if(condition1)
{
while(condition2)
{
…..
…..
}//end while(condition2)
}//end if (condition1)
或者
if(condition1){
while(condition2){
….
….
}//end while(condition2)
}//end if(conditionl)
2.3.2在操作符的前後必須使用空格。
2.3.3在分隔數組下標和函數參數的逗號後面必須添上空格。
2.3.4嚴禁使用go to 語句。
2.3.5對資料庫操作只能使用標准SQL語句,關鍵字必須使用大寫(如SELECT、WHERE等),數據元素(表、欄位、視圖等)必須按照數據字典書寫。
2.3.6程序代碼中要有足夠的容錯處理功能。
對可能發生的異常統一採用C++拋出格式:
try
{
//可能引發異常的代碼
throw t; //手工拋出異常
}
catch(type_1 e) // type_1為類型定義符、如int、CException、_com_error
{
// type_1類型異常處理
}
catch(type_2 e)
{
// type_2類型異常處理
}
2.3.7程序代碼結構必須層次清楚,適當使用空行分段。
2.3.8工程的版本控制要嚴格,版本格式為.me.ae.yy.mmdd,其中:[me]表示主版本號;[ae]表示輔版本號;[yy.mmdd]表示版本建立日期。高版本盡量兼容低版本的用法、數據或協議。
2.4文件的命名規則
2.4.1根據系統設計所規定的結構,建立相應的文件夾,根據需要建立子文件夾。
2.4.2文件夾和文件的名稱應盡量能夠表達其意義,盡量使用英文命名,絕對不能漢字。
2.4.3文件名稱一般採用「xxx_yyy.ext」格式,xxx(3-4個字母)表示分類,yyy(字母數自定)表示操作 (如 「 /example/exp_edit.htm 」)
\
我從公司文檔拷貝的!你自己看看對你有沒有用!