首页 > 代码库 > Google C++ style guide——格式

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的,关键字const应与最后一个参数位于同一行。
如果有些参数没有用到,在函数定义出将参数名注释起来。


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.条件语句
更提倡不在圆括号中添加空格,关键字else另起一行。
对基本条件语句有两种可以接受的格式,一种在圆括号和条件之间有空格,一种没有。
选择哪一种,还是以一致性为主。
注意所有情况下,if和左圆括号间有个空格,右圆括号和左大括号间也要有个空格。
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 去处理,编译器将
报警)。如果 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.初始化列表
构造函数初始化列表放在同一行或按四格缩进并排几行。
两种可以接受的初始化列表格式:
// 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.水平空白
水平空白的使用因地制宜。不要在行尾添加无谓的空白。


17.垂直空白
垂直空白越少越好。
不要在两个函数定义之间空超过2行,函数体头、尾不要有空行,函数体中也不要随意添加空行。