Google C++ style guide——格式

1.行長度
每一行代碼字符數不超過80。
例外:
1)假設一行凝視包括了超過80字符的命令或URL,出於複製粘貼的方便可以超過80字符;
2)包括長路徑的可以超出80列,儘可能避免;
3)頭文件保護可以無視該原則


2.非ASCII字符
儘可能不使用非ASCII字符,使用時必須使用UTF-8格式。
儘可能不將字符串常量耦合到代碼中。比方獨立出資源文件。




3.空格仍是製表位
僅僅使用空格,每次縮進2個空格。
使用空格進行縮進,不要在代碼中使用tab,設定編輯器將tab轉爲空格。


4.函數聲明與定義
返回類型和函數名在同一行,合適的話,參數也放在同一行。
注意一下幾點:
1)返回值老是和函數名在同一行。
2)左圓括號老是和函數名在同一行;
3)函數名和左圓括號間沒有空格;
4)圓括號和參數間沒有空格;
5)左大括號總在最後一個參數同一行的末尾處。
6)右大括號老是單獨位於函數最後一行。
7)右圓括號和左大括號間老是有一個空格。
8)函數聲明和實現處的所有形參名稱必須保持一致;
9)所有形參應儘量對齊。
10)缺省縮進爲2個空格;
11)獨立封裝的參數保持4個空格的縮進。數組


假設函數爲const的,keywordconst應與最後一個參數位於同一行。curl


假設有些參數沒實用到,在函數定義出將參數名凝視起來。編輯器




5.函數調用
儘可能放在同一行,不然,將實參封裝在圓括號裏:
bool retval = DoSomething(argumengt1,argument2,argument3);
假設同一行放不下。可斷爲多行,後面每一行都和第一個實參對齊。左圓括號和右圓括號前不要留空格:
bool retval = DoSomething(averyveryverylongargument1,argument2,argument3);
假設函數參數比較多,可以處於可讀性的考慮每行僅僅放一個參數:
bool retval = DoSomething(argument1,
                          argument2,
                          argument3,
                          argument4);
假設函數名太長。以致於超過行最大長度。可以將所有參數獨立成行:
if(...) {
  ...
  ...
  if(...) {
    DoSomethingThatRequiresALongFunctionName(
      very_long_argument1,
      argument2,
      argument3,
      argument4);
  }
}


6.條件語句
更提倡不在圓括號里加入空格,keywordelse另起一行。
對基本條件語句有兩種可以接受的格式。一種在圓括號和條件之間有空格,一種沒有。
選擇哪種。仍是以一致性爲主。
注意所有狀況下,if和左圓括號間有個空格。右圓括號和左大括號間也要有個空格。ide


if(condition)       // Bad - space missing after IF.
if (condition){      // Bad - space missing before {.
if(condition){       // Doubly bad.
if (condition) {     // Good - proper space after IF and before {
一般,單行語句不需要使用大括號,假設你喜歡也無可厚非,也有人要求if必須使用大括號。
但假設語句中哪一分支使用了大括號的話,其它部分也必須使用:
// Not allowed - curly on IF but not ELSE
if (condition) {
  foo;
} else
  bar;
// Not allowed - curly on ELSE but not IF
if (condition)
  foo;
else { 
  bar;
}
// Curly braces around both IF and ELSE required because
// one of the clauses used braces.
if (condition) {
  foo;
} else {
  bar;
}


7.循環和開關選擇語句
switch語句可以使用大括號分塊。空循環體應使用{}或continue。函數


switch 語句中的 case 塊可以使用大括號也可以不用,取決於你的喜愛,使用時要依下文所述。
假設有不知足 case 枚舉條件的值。要老是包括一個 default(假設有輸入值沒有 case 去處理,編譯器將
報警)。oop

假設 default 永不會運行,可以簡單的使用 assert:
switch (var) {
  case 0: {     // 2 space indent
    ...         // 4 space indent
    break;
  }
  case 1: {
    ...
    break;
  }
  default: {
    assert(false);
  }
}
空循環體應使用{}戒 continue,而丌是一個簡單的分號:
while (condition) {
  // Repeat test until it returns false.
}
for (int i = 0; i < kSomeNumber; ++i) {}   // Good - empty body.
while (condition) continue;      // Good - continue indicates no logic.
while (condition);         // Bad - looks like part of do/while loop.


8.指針和引用表達式
句點(.)或箭頭(->)先後不要有空格,指針/地址操做符(*,&)後不要有空格。
在聲明指針變量或參數時,星號和類型或變量名緊挨都可以:
// These are fine, space preceding.
char *c;
const string &str;
// These are fine, space following.
char* c;        // but remember to do "char* c, *d, *e, ...;"!
const string& str;
char * c;       // Bad - spaces on both sides of *
const string & str;    // Bad - spaces on both sides of &
同一個文件(新建或現有)中起碼要保持一致。




9.布爾表達式
假設一個布爾表達式超過標準行寬(80字符)。假設要斷行要統一一下。
if (this_one_thing > this_other_thing &&
  a_third_thing == a_fourth_thing &&
  yet_another & last_one) {
  ...
}


10.函數返回值
return表達式中不要使用圓括號。
函數返回時不要使用圓括號。


11.變量及數組初始化。
選擇=仍是()。


12.預處理指令
預處理指令不要縮進。從行首開始。
即便預處理指令位於縮進代碼塊中。指令也應從行首開始。
// Good - directives at beginning of line
if (lopsided_score) {
#if DISASTER_PENDING        // Correct -- Starts at beginning of line
  DropEverything();
#endif
  BackToNormal();
}
// Bad - indented directives
if (lopsided_score) {
  #if DISASTER_PENDING   // Wrong!   The "#if" should be at beginning of line
  DropEverything();
  #endif                   // Wrong!   Do not indent "#endif"
  BackToNormal();
}


13.類格式
聲明屬性依次序是public、protected、private。每次縮進一個空格。
除第一個關鍵詞外。其它關鍵詞前空一行,假設類比較小的話也可以不空。


14.初始化列表
構造函數初始化列表放在同一行或按四格縮進並排幾行。post


兩種可以接受的初始化列表格式:
// When it all fits on one line:
MyClass::MyClass(int var) : some_var_(var), some_other_var_(var + 1) {

// When it requires multiple lines, indent 4 spaces, putting the colon on
// the first initializer line:
MyClass::MyClass(int var)
    : some_var_(var),              // 4 space indent
    some_other_var_(var + 1) {     // lined up
  ...
  DoSomething();
  ...
}


15.命名空間格式化
命名空間內容不縮進。
命名空間不加入額外縮進層次,好比:
namespace {


void foo() {    // Correct.   No extra indentation within namespace.
  ...
}


}    // namespace
不要縮進:
namespace {


// Wrong.   Indented when it should not be.
  void foo() {
    ...
  }


}   // namespace


16.水平空白
水平空白的使用因地制宜。ui

不要在行尾加入無謂的空白。this




17.垂直空白
垂直空白越少越好。
不要在兩個函數定義之間空超過2行,函數體頭、尾不要有空行。函數體中也不要任意加入空行。url

相關文章
相關標籤/搜索