《Google C++编码规范》读书笔记第八章:格式
一.行长度(Line Length)
每一行的字符数不超过80。
优点:。。。
缺点:反对该原则的人则认为更宽的代码更易阅读,80字符的限制是上世纪60年代的缺陷,现在拥有更大的显示屏,很轻松地显示更多地代码。
结论:有这些例外
1. 如果包含注释或者URL,可以超过80行。
2. 头文件保护可以无视。
3. 包含长路径的可以超过80,尽量避免。
二.非ASCII字符(Non-ASCII Characters)
尽量不使用非ASCII字符,使用时必须使用UTF-8格式。
三.空格还是制表符(Space VS Tabs)
只使用空格,每次缩进2个空格。
使用空格缩进,不要使用Tabs,设定Tabs为两个空格。
四.函数声明与定义(Function Declarations and Definitions)
返回类型和函数名在同一行,合适的化,参数也放在同一行。例如:
ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
DoSomething();
...
}
如果一行放不下所有的参数:
ReturnType ClassName::FunctionName(Type par_name1,
Type par_name2,
Type par_name3) {
DoSomething();
...
}
如果甚至连第一个参数都放不下:
ReturnType ClassName::FunctionName(
Type par_name1, //4 spaces
Type par_name2,
Type par_name3) {
DoSomething(); //2 spaces
...
}
要注意的:
- 返回值、函数名、左圆括号总在在一行
- 函数名和左圆括号没有空格,左右圆括号和相邻的第一个参数也没有空格
- 左大括号和右圆括号间有一个空格,且左大括号总和最后一个参数在同一行的末尾处
- 右大括号总是单独位于函数最后一行
- 函数声明和实现处的所有形参名称必须一致
- 所有形参尽可能对齐
- 缺省缩进为两个空格
- 独立封装的参数为4个空格的缩进
如果函数是const,const和最后一个参数在一行。
五.函数调用(FUnction Calls)
尽量放在同一行,否则将实参封装在圆括号里。例如:
bool retval = DoSomething(argument1, argument2, argument3);
如果一行放不下,可以考虑第一行只放第一个参数,剩余参数在一行:
bool retval = DoSomething(argument1,
argument2, argument3);
如果参数比较多,出于可读性考虑,可以每行放一个参数:
bool retval = DoSomethingVeryVeryVeryLong(argument1,
argument2,
argument3);
如果函数名过长,可以参数都单独成行:
bool retval = DoSomethingVeryVeryVeryVeryVeryLong(
argument1, //4 spaces
argument2,
argument3);
六.条件语句
不提倡在原括号中添加空格,关键字else另起一行。
可以接受的两种格式:一种就是圆括号和条件语句中有空格,另一种就是没空格(我更倾向于没有空格,具体还是和以前代码保持一致)。
if (condition) {
... //2 spaces
} else {
...
}
有些条件语句写在同一行可以增加可读性,只有当没有else字句时使用:
if (x == kFoo) return new Foo();
if (x == kBar) return new Bar();
有else分支则不能这样写。
另外,使用大括号的时候保持一致,如果有一个分支使用了大括号,另外一个分支也要使用:
//bad
if (condition)
foo;
else {
bar;
}
//bad
if (condition) {
foo;
}
else
bar;
//good
if (condition) {
foo;
}
else {
bar;
}
七.循环和开关选择语句(Loops and Switch Statement)
switch语句中的case块可以使用大括号,也可以不适用,最好依照前文。
switch (var) {
case 0: {
...
break;
}
case 1: {
...
break;
}
default: {
assert(false);
}
}
空循环体应该使用{}或者continue,而不是一个简单的分号:
while (condition) continue; //good
while (condition); //bad
for (int i = 0; i < kSomeNumber; ++i) {} //good empty body
八.指针和引用表达式(Pointers and Reference Expressions)
句号(.)、箭头符号(->)、指针/地址操作符(*,&)后面不要有空格:
//good
x = *p;
p = &x;
x = r.y;
x = r->y;
声明指针或者引用时星号与类型名或者变量名挨着都行,看个人习惯和前后文:
char* c;
const string &str; //个人更加喜欢与变量名挨着
char * c; //bad
const string & str; //bad
九.布尔表达式(Bool Expression)
如果一个布尔表达式超过标准(80),断行要统一:
if (this_one_thing > this_other_thing &&
a_third_thing == a_fourth_thing &&
yet_another && last_one) {
...
}
十.函数返回值(Return Values)
函数返回值不要使用圆括号:
return x; //not return (x)
十一.变量以及数组初始化(Variable and Array Initialization)
选择=还是()
int x = 3;
int x(3);
string name("name");
string name = "name";
十二.预处理指令(Preprocessor Directives)
预处理指令不要缩进,即使在缩进代码中,应该从行首开始:
{
if (condition) {
#if DISASTER_PENDING
DropEverythong();
#endif
}
}
十三.类格式(Class Format)
声明属性依次为:public:,protected:,private:
,每次依次缩进哟一个空格。
class MyClass : public OtherClass {
public: //note 1 soace
MyClass(); //Regular 3 space
protected:
...
private:
...
};
十四.初始化列表(Initializer Lists)
构造函数初始化列表放在同一行或者按四格缩进并排几行。
MyClass::MyClass(int var) : some_var_(var), some_other_var(var + 1) {}
MyClass::MyClass(int var)
: some_var_(var),
some_other_var(var + 1) {
DoSomething();
}
十五.命名空间格式化(Namespace Formatting)
命名空间不要缩进:
namesapce {
void foo(); //不用缩进
}
十六.水平留白(Horizontal Whitespace)
水平留白因地制宜,不要在行尾添加无所谓的留白。
十七.垂直留白(Vertical Whitespace)
垂直留白越少越好。
函数头尾不要有空行:
void Function() {
//bad Whitespace
DoSomething()
//bad Whitespace
}
代码块的头尾也不要留白。