1. 程式人生 > >我用的C/C++編程規範——命名約定

我用的C/C++編程規範——命名約定

usr cas 字母 必須 name children conf hang 類成員變量

我使用的命名約定是google的規範,以下內容摘自《google cpp style guide》。

最重要的一致性規則是命名管理,命名風格直接可以直接確定命名實體是:類型、變量、函數、常量、宏等等,無需查找實體聲明,我們大腦中的模式匹配引擎依賴於這些命名規則。
命名規則具有一定隨意性,但相比按個人喜好命名,一致性更重要,所以不管你怎麽想,規則總歸是規則。

1. 通用命名規則(General Naming Rules)
函數命名、變量命名、文件命名應具有描述性,不要過度縮寫,類型和變量應該是名詞,函數名可以用“命令性”動詞。

如何命名:
盡可能給出描述性名稱,不要節約空間,讓別人很快理解你的代碼更重要,好的命名選擇:

int num_errors;                               // Good.
int num_completed_connections;   // Good.

醜陋的命名使用模糊的縮寫或隨意的字符:

int n;                               // Bad - meaningless.
int nerr;                           // Bad - ambiguous abbreviation.
int n_comp_conns;         // Bad - ambiguous abbreviation.

類型和變量名一般為名詞:如 FileOpener、num_errors。

函數名通常是指令性的,如 OpenFile()、set_num_errors(),訪問函數需要描述的更細致,要與其訪問的變量相吻合。

縮寫:
除非放到項目外也非常明了,否則不要使用縮寫,例如:

// Good
// These show proper names with no abbreviations.
int num_dns_connections; // Most people know what "DNS" stands for.
int price_count_reader;      // OK, price count. Makes sense.

// Bad!
// Abbreviations can be confusing or ambiguous outside a small group.
int wgc_connections; // Only your group knows what this stands for.
int pc_reader;             // Lots of things can be abbreviated "pc".

不要用省略字母的縮寫:

int error_count; // Good.
int error_cnt;     // Bad.

2. 文件命名(File Names)
文件名要全部小寫,可以包含下劃線(_)或短線(-),按項目約定來。
可接受的文件命名:
my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
C++文件以.cc 結尾,頭文件以.h 結尾。
不要使用已經存在於/usr/include 下的文件名(譯者註,對 UNIX、Linux 等系統而言),如 db.h。
通常,盡量讓文件名更加明確,http_server_logs.h 就比 logs.h 要好,定義類時文件名一般成對出現,如 foo_bar.h 和 foo_bar.cc,對應類 FooBar。
內聯函數必須放在.h 文件中,如果內聯函數比較短,就直接放在.h 中。如果代碼比較長,可以放到以-inl.h 結尾的文件中。對於包含大量內聯代碼的類,可以有三個文件:
url_table.h // The class declaration.
url_table.cc // The class definition.
url_table-inl.h // Inline functions that include lots of code.

3. 類型命名(Type Names)
類型命名每個單詞以大寫字母開頭,不包含下劃線:MyExcitingClass、MyExcitingEnum。
所有類型命名——類、結構體、類型定義(typedef)、枚舉——使用相同約定,例如:

// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { …

// typedefs
typedef hash_map<UrlTableProperties *, string> PropertiesMap;

// enums
enum UrlTableErrors { …

4. 變量命名(Variable Names)
變量名一律小寫,單詞間以下劃線相連,類的成員變量以下劃線結尾,如my_exciting_local_variable、my_exciting_membervariable

普通變量命名:
舉例:

string table_name;   // OK - uses underscore.
string tablename;     // OK - all lowercase.
string tableName;    // Bad - mixed case.

類數據成員:
結構體的數據成員可以和普通變量一樣,不用像類那樣接下劃線:

struct UrlTableProperties {
  string name;
  int num_entries;
}

全局變量:
對全局變量沒有特別要求,少用就好,可以以 g_或其他易與局部變量區分的標誌為前綴。

5. 常量命名(Constant Names)
在名稱前加 k:kDaysInAWeek。
所有編譯時常量(無論是局部的、全局的還是類中的)和其他變量保持些許區別,k 後接大寫字母開頭的單詞:

const int kDaysInAWeek = 7;

6. 函數命名(Function Names)
普通函數(regular functions,譯者註,這裏與訪問函數等特殊函數相對)大小寫混合,存取函數(accessors and mutators)則要求與變量名匹配:MyExcitingFunction()、MyExcitingMethod()、my_exciting_member_variable()、
set_my_exciting_member_variable()。

普通函數:
函數名以大寫字母開頭,每個單詞首字母大寫,沒有下劃線:
AddTableEntry()
DeleteUrl()

存取函數:
存取函數要與存取的變量名匹配,這兒摘錄一個擁有實例變量 num_entries_的類:

class MyClass {
public:
    ...
  int num_entries() const { return num_entries_; }
  void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
  int num_entries_;
};

其他短小的內聯函數名也可以使用小寫字母,例如,在循環中調用這樣的函數甚至都不需要緩存其值,小寫命名就可以接受。
譯者註:從這一點上可以看出,小寫的函數名意味著可以直接內聯使用。

7. 命名空間(Namespace Names)
命名空間的名稱是全小寫的,其命名基於項目名稱和目錄結構:google_awesome_project。

8. 枚舉命名(Enumerator Names)
枚舉值應全部大寫,單詞間以下劃線相連:MY_EXCITING_ENUM_VALUE。
枚舉名稱屬於類型,因此大小寫混合:UrlTableErrors。

enum UrlTableErrors {
  OK = 0,
  ERROR_OUT_OF_MEMORY,
  ERROR_MALFORMED_INPUT,
};

9. 宏命名(Macro Names)
你並不打算使用宏,對吧?如果使用,像這樣:MY_MACRO_THAT_SCARES_SMALL_CHILDREN。
參考預處理宏,通常是不使用宏的,如果絕對要用,其命名像枚舉命名一樣全部大寫、使用下劃線:

#define ROUND(x) ...
#define PI_ROUNDED 3.0
MY_EXCITING_ENUM_VALUE

10. 命名規則例外(Exceptions to Naming Rules)
當命名與現有 C/C++實體相似的對象時,可參考現有命名約定:
bigopen()
函數名,參考 open()
uint
typedef 類型定義
bigpos
struct 或 class,參考 pos
sparse_hash_map
STL 相似實體;參考 STL 命名約定
LONGLONG_MAX
常量,類似 INT_MAX

————————————————————————————————
譯者:命名約定相對輕松許多,在遵從代碼一致性、可讀性的前提下,略顯隨意:

  1. 總體規則:不要隨意縮寫,如果說 ChangeLocalValue 寫作 ChgLocVal 還有情可原的話,把 ModifyPlayerName 寫作 MdfPlyNm 就太過分了,除函數名可適當為動詞外,其他命名盡量使用清晰易懂的名詞;
  2. 宏、枚舉等使用全部大寫+下劃線;
  3. 變量(含類、結構體成員變量)、文件、命名空間、存取函數等使用全部小寫+下劃線,類成員變量以下劃線結尾,全局變量以 g_開頭;
  4. 普通函數、類型(含類與結構體、枚舉類型)、常量等使用大小寫混合,不含下劃線;
  5. 參考現有或相近命名約定。

我用的C/C++編程規範——命名約定