鏈接:http://blog.163.com/gaoguangtao_love/blog/static/384837152007111410302365/
命名規範和C/C++源代碼書寫
命 名 規 範(試行)
通則:
1、在所有命名中,都應使用標準的英文單詞或縮寫。不得使用拼音或拼音縮寫,除非該名字描述的是中文特有的內容,如半角、全角, 聲母、韻母等。
2、所有命名都應遵循達意原則,即名稱應含義清晰、明確。
3、所有命名都不易過長,應控制在規定的最大長度以內。
4、所有命名都應儘量使用全稱。
5、如果命名使用縮寫,則應該使用《通用縮寫表》(見附錄)中的縮寫;原則上不推薦使用《通用縮寫表》以外的縮寫,如果使用,則必須對其進行註釋和說明。
具體規範:
1、工程名: 不強制統一。
2、文件名:
·基於工程名,開頭3個字母應表明與哪一個工程相關。
·後面的字母應能夠區別不同的功能。
·不區分大小寫。
·長度不限於8.3格式,建議不多於30個字符。
·若文件用於定義和實現類,建議文件名與類名保持一致。
3、函數名:
·參照 Windows API 的命名規範。
·推薦使用動賓結構。函數名應清晰反映函數的功能、用途。
·函數名最長不得超過30個字符。
·函數名第一個字母必須大寫。
·全局函數必須以小寫前綴"g"開頭。
4、變量名: 原則上,變量名的命名遵從匈牙利記法。即:前綴 + 類型 + 變量名
1)格式:
[m_|s_|g_] type [class name|struct name] variable name
2)解釋:
·m_ : 類的成員變量
·ms_:類的靜態成員變量
·s_ :靜態全局變量
·g_ :普通全局變量
·類型縮寫(type)
·char, TCHAR: ch
·char[],TCHAR[]: sz
·bool, BOOL: b
·int, __int16,__int32,__int64: n
·long: l
·double: d
·float: ft
·BYTE: by
·WORD: w
·DWORD: dw
·unsigned: u
·function: fn
·p :pointer
·lp :pointer
變量名最長不得超過20個字符。
5、類名:
·必須以大寫"K"開頭,後面字母反映具體含義,以清晰表達類的用途和功能爲原則。
·接口必須以大寫"I"開頭,代表 Interface 。
·當名稱由多個單詞構成時,每一個單詞的第一個字母必須大寫。
6、結構名、宏名、枚舉名、聯合名:
·全部大寫。
·枚舉名加小寫前綴"enum"。
例:
typedef enum _KFILE_OPEN_MODE
{
enumOPEN_READONLY = 0,
enumOPEN_READWRITE = 1,
enumCREATE_ALWAY = 3
} KFILE_OPEN_MODE;
//·宏名加小寫前綴"def"。
例:
#define defMAXNUMBER 100
·結構名加小寫前綴"tag",之後必須以大寫"K"開頭。
例:
typedef struct tagKPOINT
{
int x;
int y;
} KPOINT;
//·聯合名加小寫前綴"uni"。
例:
typedef union _VARIANT{
char unichVal;
int uninVal;
long unilVal;
float uniftVal;
...
} VARIANT;
C/C++源代碼書寫規範(試行)
1. 在.h/.cpp的開頭應有一段格式統一的說明,內容包括:
a. 文件名 (FileName);
b. 創建人 (Creater);
c. 文件創建時間 (Date);
d. 簡短說明文件功能、用途 (Comment)。
2. 除非極其簡單,否則對函數應有註釋說明。
內容包括:功能、入口/出口參數,必要時還可有備註或補充說明。
3. 每行代碼的長度推薦爲80列,最長不得超過120列;折行以對齊爲準。
例:HANDLE KSOpenFile(const char cszFileName[], int nMode);
或者:
BOOL KSReadFile( HANDLE hFile, void *pvBuffer, int nReadSize, int *pnReadSize);
4. 循環、分支代碼,判斷條件與執行代碼不得在同一行上。
例:正確:
if (n == -2)
n = 1;
else
n = 2;
不得寫做:
if (n == -2) n = 1;
else n = 2;
5. 指針的定義,* 號既可以緊接類型,也可以在變量名之前。
例:可寫做:int* pnsize;
也可寫做:int *pnsize;
但不得寫做:int * pnsize;
6. 在類的成員函數內調用非成員函數時,在非成員函數名前必須加上“::”。
7. 函數入口參數有缺省值時,應註釋說明。
例: BOOL KSSaveToFile( const char cszFileName[], BOOL bCanReplace /* = TRUE */ );
或者: BOOL KSSaveToFile( const char cszFileName[], BOOL bCanReplace // = TRUE );
8. else if 必須寫在一行。
9. 與‘{’、‘}’有關的各項規定:
9.1‘{’、‘}’應獨佔一行。在該行內可有註釋。
例:正確:
for (i = 0; i < cbLine; i++)
{ // .....
printf("Line %d:", i);
printf("%s\n", pFileLines);
}
不得寫做:
for (i = 0; i < cb; i++)
{ printf("Line %d:", i);
printf("%s\n", pFileLines);
}
9.2‘{’必須另起一行,‘{’之後的代碼必須縮進一個Tab。‘{’與‘}’必須在同一列上。
例:正確:
if (i > 0)
{
m = 1;
n++;
}
不得寫做:
if (i > 0) {
m = 1;
n++;
}
例外:
if (i == 0)
{ ASSERT(FALSE); return; }
9.3 在循環、分支之後若只有一行代碼,雖然可省略‘{’、‘}’,但不推薦這麼做。若省略後可能引起歧義,則必須加上‘{’、‘}’。
例:正確:
if (n == -2)
n = 1;
else
n = 2;
或者:
if (n == -2)
{ n = 1; }
else if (n != nTemp)
{ n = 2; }
else
{ n = 3; }
不得寫做:
if (n == -2)
n = 1;
else if (n != nTemp)
n = 2;
else
n = 3;
不推薦:
if (i < 1)
{ n = 1; }
else
{
if (i == 1)
{ n = 2; }
else
{
if (i > 1)
{ n = 3; }
}
}
10. 與空格有關的各項規定。
10.1 在所有兩目、三目運算符的兩邊都必須有空格。在單目運算符兩端不必空格。但在‘->’、‘::’、‘.’、‘[’、‘]’等運算符前後,及‘&’(取地址)、‘*’(取值)等運算符之後不得有空格。
例:正確:
int n = 0, nTemp;
for (int i = nMinLine; i <= nMaxLine; i++)
不得寫做:
int n=0, nTemp;
for ( int i=nMinLine; i<=nMaxLine; i++ )
10.2 for、while、if 等關鍵詞之後應有1個空格,再接‘(’,之後無空格;在結尾的‘)’前不得有空格。
例:正確:
if (-2 == n)
不得寫做:
if(-2 == n)
或
if ( -2 == n )
等等。
10.3 調用函數、宏時,‘(’、‘)’前後不得有空格。
例:正確:
printf("%d\n", nIndex);
不得寫做:
printf ("%d\n", nIndex);
printf( "%d\n", nIndex );
等等。
10.4 類型強制轉換時,‘(’‘)’前後不得有空格
例:可寫做:
(KSFile*)pFile;
也可寫做:
(KSFile *)pFile
不得寫做:
( KSFile* )pFile
( KSFile * ) pFile
11. 與縮進有關的各項規定
11.1 縮進以 Tab 爲單位。1 個 Tab 爲 4 個空格
11.2 下列情況,代碼縮進一個 Tab:
1. 函數體相對函數名及‘{’、‘}’。
例:
int Power(int x)
{
return (x * x);
}
2. if、else、for、while、do 等之後的代碼。
3. 一行之內寫不下,折行之後的代碼,應在合理的位置進行折行。若有 + - * / 等運算符,則運算符應在上一行末尾,而不應在下一行的行首。
11.3 下列情況,不必縮進:switch 之後的 case、default。
例:
switch (nID)
{
case ID_PLAY:
......
break;
case ID_STOP:
......
break;
default:
......
break;
}