C語言命名規範
- 2019 年 10 月 5 日
- 筆記
C是一門樸素的語言,你使用的命名也應該這樣。然而,當面對複雜情況時就有些棘手,給全局變數取一個描述性的名字是必要的。把一個全局函數叫做「foo」是一種目光短淺的行為。全局函數也一樣,如果你有一個統計當前用戶個數的函數,應當把它命名為「count_active_user()」或者簡單點些的類似名稱,不應該命名為「cntusr()」。1.三種流行的命名法則目前,業界共有四種命名法則:駝峰命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法,其中前三種是較為流行的命名法。駝峰命令法。正如它的名稱所表示的那樣,是指混合使用大小寫字母來構成變數和函數的名字,其實我們工作比較常用的就是駝峰命令法。例如,下面是分別用駱駝式命名法和下劃線法命名的同一個函數:printEmployeePaychecks();
print_employee_paychecks();第一個函數名使用了駝峰命名法,函數名中的每一個邏輯斷點都有一個大寫字母來標記。第二個函數名使用了下劃線法,函數名中的每一個邏輯斷點都有一個下劃線來標記。駝峰命名法近年來越來越流行了,在許多新的函數庫和Microsoft Windows這樣的環境中,它使用得當相多。另一方面,下劃線法是C出現後開始流行起來的,在許多舊的程式和UNIX這樣的環境中,它的使用非常普遍。匈牙利命名法。廣泛應用於象Microsoft Windows這樣的環境中。Windows 編程中用到的變數(還包括宏)的命名規則為匈牙利命名法,這種命名技術是由一位能幹的 Microsoft 程式設計師查爾斯-西蒙尼(Charles Simonyi) 提出的。匈牙利命名法通過在變數名前面加上相應的小寫字母的符號標識作為前綴,標識出變數的作用域、類型等。這些符號可以多個同時使用,順序是先m_(成員變數)、再指針、再簡單數據類型、再其它。這樣做的好處在於能增加程式的可讀性,便於對程式的理解和維護。例如:m_lpszStr, 表示指向一個以0字元結尾的字元串的長指針成員變數。匈牙利命名法關鍵是:標識符的名字以一個或者多個小寫字母開頭作為前綴;前綴之後的是首字母大寫的一個單詞或多個單片語合,該單詞要指明變數的用途。帕斯卡(pascal)命名法。與駝峰命名法類似,二者的區別在於:駝峰命名法是首字母小寫,而帕斯卡命名法是首字母大寫,如:DisplayInfo();string UserName;二者都是採用了帕斯卡命名法。三種命名規則的小結:MyData就是一個帕斯卡命名的示例;MyData是一個駝峰命名法,它第一個單詞的第一個字母小寫,後面的單詞首字母大寫,看起來像一個駱駝;iMyData是一個匈牙利命名法,它的小寫的i說明了它的型態,後面的和帕斯卡命名相同,指示了該變數的用途。
2-命名的基本原則:標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解——盡量採用採用英文單詞或全部中文全拼表示,若出現英文單詞和中文混合定義時,使用連字元「_」將英文與中文割開。較短的單詞可通過去掉「母音」形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。例如:temp->tmp、flag->標誌暫存器、statistic->stat、increment->inc、message->msg等縮寫能夠被大家基本認可。命名中若使用特殊約定或縮寫,則要有注釋說明。應該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的注釋說明。自己特有的命名風格,要自始至終保持一致,不可來回變化。個人的命名風格,在符合所在項目組或產品組的命名規則的前提下,才可使用。(即命名規則中沒有規定到的地方才可有個人命名風格)。對於變數命名,禁止取單個字元(如i 、j 、k… ),建議除了要有具體含義外,還能表明其變數類型、數據類型等,但i 、j 、k 作局部循環變數是允許的。變數,尤其是局部變數,如果用單個字元表示,很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。除非必要,不要用數字或較奇怪的字元來定義標識符。命名規範必須與所使用的系統風格保持一致,並在同一項目中統一。在同一軟體產品內,應規劃好介面部分標識符(變數、結構、函數及常量)的命名,防止編譯、鏈接時產生衝突。對介面部分的標識符應該有更嚴格限制,防止衝突。如可規定介面部分的變數與常量之前加上「模組」標識等。用正確的反義片語命名具有互斥意義的變數或函數等。下面是一些在軟體中常用的反義片語。
示例:int nin_sum;int nax_sum;int add_user(BYTE *user_name);int delete_user(BYTE *user_name);除了編譯開關/ 頭文件等特殊應用,應避免使用EXAMPLE_TEST 之類以下劃線開始和結尾的定義。
3-變數名的命名規則
變數的命名規則要求用「匈牙利法則」。即開頭字母用變數的類型,其餘部分用變數的英文意思、英文的縮寫、中文全拼或中文全拼的縮寫,要求單詞的第一個字母應大寫。即:變數名=變數類型+變數的英文意思(或英文縮寫、中文全拼、中文全拼縮寫)對非通用的變數,在定義時加入注釋說明,變數定義盡量可能放在函數的開始處:bool 用b開頭b標誌暫存器,int用i開頭iCount,short int用n開頭nStepCount,long int 用l開頭 lSum,char 用c開頭 cCount,unsigned char 用by開頭,float 用f開頭 fAvg。double 用d開頭 dDeta,unsigned int(WORD) 用w開頭 wCount,unsigned long int(DWORD) 用dw開頭 dwBroad。字元串 用s開頭 sFileName,用0結尾的字元串 用sz開頭 szFileName。指針變數命名的基本原則為:對一重指針變數的基本原則為:「p」+變數類型前綴+命名,如一個float*型應該表示為pfStat。對二重指針變數的基本規則為:「pp」+變數類型前綴+命名。對三重指針變數的基本規則為:「ppp」+變數類型前綴+命名。全局變數用g_開頭,如一個全局的長型變數定義為g_lFailCount。即:變數名=g_+變數類型+變數的英文意思(或縮寫)。此規則還可避免局部變數和全局變數同名而引起的問題。靜態變數用s_開頭,如一個靜態的指針變數定義為s_plPerv_Inst。即:變數名=s_+變數類型+變數的英文意思(或縮寫)。對枚舉類型(enum)中的變數,要求用枚舉變數或其縮寫做前綴。並且要求用大寫。如:
對struct、union變數的命名要求定義的類型用大寫。並要加上前綴,其內部變數的命名規則與變數命名規則一致。結構一般用S開頭,如:
聯合體一般用U開頭,如:
對常量(包括錯誤的編碼)命名,要求常量名用大寫,常量名用英文表達其意思。當需要由多個單詞表示時,單詞與單詞之間必須採用連字元「_」連接。如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示類別。(8)對const 的變數要求在變數的命名規則前加入c_。即:c_+變數命名規則;示例:const char* c_szFileName;
4-函數的命名規範
函數的命名應該盡量用英文(或英文縮寫、中文全拼、中文全拼縮寫)表達出函數完成的功能——函數名應準確描述函數的功能。遵循動賓結構的命名法則,函數名中動詞在前,並在命名前加入函數的前綴,函數名的長度不得少於8個字母。函數名首字大寫,若包含有兩個單詞的每個單詞首字母大寫。如果是OOP 方法,可以只有動詞(名詞是對象本身)。示例:
避免使用無意義或含義不清的動詞為函數命名。如使用process、handle等為函數命名,因為這些動詞並沒有說明要具體做什麼。必須使用函數原型聲明。函數原型聲明包括:引用外來函數及內部函數,外部引用必須在右側註明函數來源:模組名及文件名;內部函數,只要注釋其定義文件名——和調用者在同一文件中(簡單程式)時不需要注釋。應確保每個函數聲明中的參數的名稱、類型和定義中的名稱、類型一致。
5-函數參數命名規範
參數名稱的命名參照變數命名規範。為了提高程式的運行效率,減少參數佔用的堆棧,傳遞大結構的參數,一律採用指針或引用方式傳遞。為了便於其他程式設計師識別某個指針參數是入口參數還是出口參數,同時便於編譯器檢查錯誤,應該在入口參數前加入const標誌。如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
6-文件名
(包括動態庫、組件、控制項、工程文件等)的命名規範文件名的命名要求表達出文件的內容,要求文件名的長度不得少於5個字母,嚴禁使用象file1,myfile之類的文件名。
更多乾貨筆記關注微信公眾號 : 老九學堂