規范的代碼讓程序具有美感,我更願意去閱讀她。
參考google編碼規范 http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/
文件命名
總述
文件名要全部小寫, 可以包含下划線 (_
) 或連字符 (-
), 依照項目的約定. 如果沒有約定, 那么 “_
” 更好.
說明
可接受的文件命名示例:
my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
myusefulclass_test.cc
//_unittest
和_regtest
已棄用.
C++ 文件要以 .cc
結尾, 頭文件以 .h
結尾. 專門插入文本的文件則以 .inc
結尾, 參見 頭文件自足.
不要使用已經存在於 /usr/include
下的文件名 (Yang.Y 注: 即編譯器搜索系統頭文件的路徑), 如 db.h
.
通常應盡量讓文件名更加明確. http_server_logs.h
就比 logs.h
要好. 定義類時文件名一般成對出現, 如 foo_bar.h
和 foo_bar.cc
, 對應於類 FooBar
.
內聯函數必須放在 .h
文件中. 如果內聯函數比較短, 就直接放在 .h
中.
**我之前的做法是單詞首字母大寫和類名一樣,也不知道好不好,看arduino庫代碼也是如此。這條就不參照谷歌了。
類型命名
總述
類型名稱的每個單詞首字母均大寫, 不包含下划線: MyExcitingClass
, MyExcitingEnum
.
說明
所有類型命名 —— 類, 結構體, 類型定義 (typedef
), 枚舉, 類型模板參數 —— 均使用相同約定, 即以大寫字母開始, 每個單詞首字母均大寫, 不包含下划線. 例如:
// 類和結構體
class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { ... // 類型定義 typedef hash_map<UrlTableProperties *, string> PropertiesMap; // using 別名 using PropertiesMap = hash_map<UrlTableProperties *, string>; // 枚舉 enum UrlTableErrors { ...
**類的命名和我之前的做法一致,只是我不知道類型命名都如此。(類名,結構體名,類型定義,別名,枚舉類名)
變量命名
總述
變量 (包括函數參數) 和數據成員名一律小寫, 單詞之間用下划線連接. 類的成員變量以下划線結尾, 但結構體的就不用, 如: a_local_variable
, a_struct_data_member
, a_class_data_member_
.
說明
普通變量命名
舉例:
string table_name; // 好 - 用下划線. string tablename; // 好 - 全小寫. string tableName; // 差 - 混合大小寫
類數據成員
不管是靜態的還是非靜態的, 類數據成員都可以和普通變量一樣, 但要接下划線.
class TableInfo { ... private: string table_name_; // 好 - 后加下划線. string tablename_; // 好. static Pool<TableInfo>* pool_; // 好. };
結構體變量
不管是靜態的還是非靜態的, 結構體數據成員都可以和普通變量一樣, 不用像類那樣接下划線:
struct UrlTableProperties { string name; int num_entries; static Pool<UrlTableProperties>* pool; };
**此處靜態和非靜態沒有區分感覺不好,不知道在哪看到靜態 s_打頭,全局 g_打頭。下次補上。
常量命名
總述
聲明為 constexpr
或 const
的變量, 或在程序運行期間其值始終保持不變的, 命名時以 “k” 開頭, 大小寫混合. 例如:
const int kDaysInAWeek = 7;
說明
所有具有靜態存儲類型的變量 (例如靜態變量或全局變量, 參見 存儲類型) 都應當以此方式命名. 對於其他存儲類型的變量, 如自動變量等, 這條規則是可選的. 如果不采用這條規則, 就按照一般的變量命名規則.
**這里提到所有具有靜態存儲類型的變量 (例如靜態變量或全局變量, 參見 存儲類型) 都應當以此方式命名 ,以 “k” “s” "g"開頭, 大小寫混合。
函數命名
總述
常規函數使用大小寫混合, 取值和設值函數則要求與變量名匹配: MyExcitingFunction()
, MyExcitingMethod()
, my_exciting_member_variable()
, set_my_exciting_member_variable()
.
說明
一般來說, 函數名的每個單詞首字母大寫 (即 “駝峰變量名” 或 “帕斯卡變量名”), 沒有下划線. 對於首字母縮寫的單詞, 更傾向於將它們視作一個單詞進行首字母大寫 (例如, 寫作 StartRpc()
而非 StartRPC()
).
AddTableEntry() DeleteUrl() OpenFileOrDie()
(同樣的命名規則同時適用於類作用域與命名空間作用域的常量, 因為它們是作為 API 的一部分暴露對外的, 因此應當讓它們看起來像是一個函數, 因為在這時, 它們實際上是一個對象而非函數的這一事實對外不過是一個無關緊要的實現細節.)
取值和設值函數的命名與變量一致. 一般來說它們的名稱與實際的成員變量對應, 但並不強制要求. 例如 int count()
與 void set_count(int count)
.
**我嚴重習慣函數命名首字母小寫,這個還是保持吧。取值和設值與變量名一致 get_count() ,set_count()。
命名空間命名
總述
命名空間以小寫字母命名. 最高級命名空間的名字取決於項目名稱. 要注意避免嵌套命名空間的名字之間和常見的頂級命名空間的名字之間發生沖突.
頂級命名空間的名稱應當是項目名或者是該命名空間中的代碼所屬的團隊的名字. 命名空間中的代碼, 應當存放於和命名空間的名字匹配的文件夾或其子文件夾中.
注意 不使用縮寫作為名稱 的規則同樣適用於命名空間. 命名空間中的代碼極少需要涉及命名空間的名稱, 因此沒有必要在命名空間中使用縮寫.
要避免嵌套的命名空間與常見的頂級命名空間發生名稱沖突. 由於名稱查找規則的存在, 命名空間之間的沖突完全有可能導致編譯失敗. 尤其是, 不要創建嵌套的 std
命名空間. 建議使用更獨特的項目標識符 (websearch::index
, websearch::index_util
) 而非常見的極易發生沖突的名稱 (比如 websearch::util
).
對於 internal
命名空間, 要當心加入到同一 internal
命名空間的代碼之間發生沖突 (由於內部維護人員通常來自同一團隊, 因此常有可能導致沖突). 在這種情況下, 請使用文件名以使得內部名稱獨一無二 (例如對於 frobber.h
, 使用 websearch::index::frobber_internal
).
**命名空間這個還沒用到
枚舉命名
總述
枚舉的命名應當和 常量 或 宏 一致: kEnumName
或是 ENUM_NAME
.
說明
單獨的枚舉值應該優先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚舉名 UrlTableErrors
(以及 AlternateUrlTableErrors
) 是類型, 所以要用大小寫混合的方式.
enum UrlTableErrors { kOK = 0, kErrorOutOfMemory, kErrorMalformedInput, }; enum AlternateUrlTableErrors { OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2, };
2009 年 1 月之前, 我們一直建議采用 宏 的方式命名枚舉值. 由於枚舉值和宏之間的命名沖突, 直接導致了很多問題. 由此, 這里改為優先選擇常量風格的命名方式. 新代碼應該盡可能優先使用常量風格. 但是老代碼沒必要切換到常量風格, 除非宏風格確實會產生編譯期問題.
宏命名
總述
你並不打算 使用宏, 對吧? 如果你一定要用, 像這樣命名: MY_MACRO_THAT_SCARES_SMALL_CHILDREN
.
說明
參考 預處理宏; 通常 不應該 使用宏. 如果不得不用, 其命名像枚舉命名一樣全部大寫, 使用下划線:
#define ROUND(x) ...
#define PI_ROUNDED 3.0
**全大寫下滑線分割