Google C++編程命名規範

來源:互聯網
上載者:User

1. 總體規則:不要隨意縮寫;2. 宏、枚舉等使用全部大寫+底線;3. 變數(含類、結構體成員變數)、檔案、命名空間、存取函數等使用全部小寫+底線,類成員變數以底線結尾,全域變數以g_開頭;4. 參考現有或相近命名規範……

  • 命名規範

最重要的一致性規則是命名管理,命名風格直接可以直接確定具名實體是:類型、變數、函數、常量、宏等等,無需尋找實體聲明,我們大腦中的模式比對引擎依賴於這些命名規則。

命名規則具有一定隨意性,但相比按個人喜好命名,一致性更重要,所以不管你怎麼想,規則總歸是規則。

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.

 

類型和變數名一般為名詞:如FileOpenernum_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.hfoo_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.

 

參考第一篇-inl.h檔案一節。

3. 類型命名(Type Names)

類型命名每個單詞以大寫字母開頭,不包含底線:MyExcitingClassMyExcitingEnum

所有類型命名——類、結構體、類型定義(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_variablemy_exciting_member_variable_

普通變數命名

舉例:

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

 

 

類資料成員

結構體的資料成員可以和普通變數一樣,不用像類那樣接底線:

struct UrlTableProperties {
string name;
int num_entries;
}

 

結構體與類的討論參考第三篇結構體vs.類一節。

全域變數

對全域變數沒有特別要求,少用就好,可以以g_或其他易與局部變數區分的標誌為首碼。

5. 常量命名(Constant Names)

在名稱前加kkDaysInAWeek

所有編譯時間常量(無論是局部的、全域的還是類中的)和其他變數保持些許區別,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
structclass,參考 pos
sparse_hash_map
STL相似實體;參考STL命名規範
LONGLONG_MAX
常量,類似 INT_MAX

______________________________________

譯者:命名規範就相對輕鬆許多,在遵從代碼一致性、可讀性的前提下,略顯隨意:

1. 總體規則:不要隨意縮寫,如果說ChangeLocalValue寫作ChgLocVal還有情可原的話,把ModifyPlayerName寫作MdfPlyNm就太過分了,除函數名可適當為動詞外,其他命名盡量使用清晰易懂的名詞;

2. 宏、枚舉等使用全部大寫+底線;

3. 變數(含類、結構體成員變數)、檔案、命名空間、存取函數等使用全部小寫+底線,類成員變數以底線結尾,全域變數以g_開頭;

4. 普通函數、類型(含類與結構體、枚舉類型)、常量等使用大小寫混合,不含底線;

5. 參考現有或相近命名規範。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.