C++的命名規範

C++的實踐中存在多種多樣的命名方法。選擇一種邏輯自洽的方案並實施到自己的開發中是一件令人愉快的事。

一、匈牙利命名法

這是一套完整的命名體系,包含一系列規則,VC++採用這種命名規則。windows API、MFC等,在Windows中一切(也有一些例外:如ISO規定的標準庫)與C++有關的技術,均採用匈牙利命名法。unix的東西常常被追捧(例如:vim、Emacs,即使它們已經太過古老),Windows常常莫名其妙的被鄙視。不知是否受了Windows的拖累,這種命名方法受到了不少批評。我感覺這種批評多依據不足,甚至站不住腳。如果希望研究一下匈牙利命名法,參看百度百科:匈牙利命名法。

二、Google Style Guides

Google Style Guides 包含C++規範,這個C++規範中包含關於命名規範的介紹,爲了方便我在下文稱爲Google Style Guides命名規範。在unix或跨平臺項目中,匈牙利命名法顯得那麼格格不入,Google Style Guides命名規範更有unix範。下面介紹Google Style Guides命名規範,同時介紹了我沒有遵守的地方,我沒有遵守的地方使用斜體文字表達。在下文也介紹了駝峯命名法和帕斯卡命名法,雖然看似這兩種是與匈牙利命名法齊名的,但前者分別只代表一條規則,並非一套體系,所以只作爲Google Style Guides命名規範的一部分介紹。

1、通用

命名一個標識符時,一般不使用縮寫,除非這個縮寫是C++的慣例用法(for語句中表示索引的i)或行業內的慣用縮寫(如GPS)。出於某些原因,在項目中我有時不遵守這個規則,比如有些不太好的縮寫在項目中已經廣泛使用等等。

對於多個單詞組成的標識符,常採用首字母大寫的方式分割每個單詞。很多專有名詞或縮寫的英文是全大寫,比如RPC、GPS。Google的建議是在作爲標識符一部分時首字母大寫,例如:StartRpc()。我習慣保持全大寫,例如StartRPC();

CamelCase(駝峯命名法):多個單詞構成一個標識符時,第一個單詞以小寫字母開始;從第二個單詞開始以後的每個單詞的首字母都採用大寫字母,例如:myFirstName、myLastName,這樣的變量名看上去就像駱駝峯一樣此起彼伏,故得名。PascalCase(帕斯卡命名法):與CamelCase相比這種命名方法的標識符首字母大寫,其他與CamelCase一樣,例如:SomeClass、SomeStruct。

2、文件名稱

Google建議的命名方法是:文件名使用小寫字母,以'_'或'-'分割每個單詞(‘_’和‘-’不可在一個文件名中混用)。一個公司或項目最好約定統一用'_'或'-'。如果沒有這種約定,優先選擇‘_’分割。擴展名使用.cc和.h。避免與操作系統、標準庫、編譯器提供的頭文件重名。避免名稱過於通用,例如:http_server_log.h優於log.h。

由於visual studio採用的規則與Google的建議不同。我採用PascalCase。擴展名使用.cpp和.h。一個類與同名的文件名匹配class SomeClass<==>SomeClass.h SomeClass.cpp。

3、類型名稱

類、結構體、枚舉、類型別名、模板類型參數(classes, structs, type aliases, enums, and type template parameters)採用PascalCase。

4、變量名稱

變量(variables (including function parameters) and data members)命名方法:小寫並使用‘_‘分割單詞。對於類(非結構體)的成員變量在變量名後加'_'。例如:local_variable,struct_data_member,class_data_member_。

5、常量名稱

Google建議的命名方法是:PascalCase加上前綴k。例如:const int kDaysInAWeek = 7; 在罕見的情況下,可能無法實現用大寫字母分割單詞可以採用'_'。例如:const int kAndroid8_0_0 = 24; // Android 8.0.0

我沒有遵守這條規則,我一般把變量的命名法應用到常量上。

6、函數名稱

這裏的函數包含全局函數和類方法。函數採用PascalCase。

除此之外Google還建議在爲訪問器和賦值器命名時採用變量的命名方式,並與變量的命名相對應。例如:變量int count_的存、取器命名爲,void set_count(int count);int count();。

因爲訪問器和賦值器無論從概念上還是本質上都是函數,如果以變量方式命名,容易讓人把它與變量混淆,所以函數我一律採用PascalCase。

7、宏

宏的命名方法:全大寫,並且使用'_'分割單詞。因爲預處理器在不進行語法分析的前提下進行替換,如果宏的名稱與其他標識符重名,將一律進行替換。所以採用這種奇怪的命名方法,最大限度的避免重名。在有替代方案的情況下,通常你不應該使用宏。

我認同Google的建議,希望最小限度的使用宏,我常常感到宏的使用給調試帶來的障礙。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章