以下是google工程师在编程过程中对空格使用的约定:
1. Horizontal Whitespace(水平留白)
水平方向空格的使用取决于具体的位置。不要在一行代码的结尾处放置空格。
一般的:
void f(bool b) { //在大括号的前面应该总是有一个空格
...
int i = 0; // 分号前面通常不放空格
int x[] = { 0 }; // 在给数组初始化时,括号中的空格是
int x[] = {0}; // 可选的。如果要使用空格,请在元素的两边都放上。
// 在继承和初始化列表中冒号两边要加空格Spaces around the colon in inheritance and initializer lists.
class Foo : public Bar {
public:
// 对应inline的函数实现,在它的括号和具体的实现直接放上空格
Foo(int b) : Bar(), baz_(b) {} // 空括号中不放空格
void Reset() { baz_ = 0; } // 空格将括号和实现分隔开
...
在合并代码时,末尾加空格会给其他人带来额外的工作量,因为要去除末尾存在的代码。所以:不要在末尾添加空格。如果你已经添加了,请删除它,或者在一个单独的清理操作中删除(最好在没有其他人正在使用你的文件的时候)。
Loops and Conditionals(循环和条件式)
if (b) { // 在条件句和循环的关键字后面加上空格
} else { // 在else的两边加上空格.
}
while (test) {} // 在圆括号中通常没有空格.
switch (i) {
for (int i = 0; i < 5; ++i) {
switch ( i ) { // 在循环和条件句的
if ( test ) { // 圆括号中添加空格是罕见的,如果要使用请前后保持一致
for ( int i = 0; i < 5; ++i ) {
for ( ; i < 5 ; ++i) { // For 循环常常在分号的前后有一个空格
for (auto x : counts) { // 基于范围的for循环常常在冒号的前后有一个空格
}
switch (i) {
case 1: // 在case的冒号前没有空格
...
case 2: break; //在冒号的后面添加一个空格,如果其后还有代码
Operators(运算符)
x = 0; // 赋值操作符的两边常常有空格
x = -5; // 在一元操作符和他的参数之间没有空格
++x;
if (x && !y)
...
v = w * x + y / z; // 二元操作符的两边常常有空格
v = w*x + y/z; // 但是也可以删除factors周围的空格
v = w * (x + z); // 圆括号里面没有空格 .
Templates and Casts(模版和强制类型转换)
vector<string> x; // 在尖括号里面
y = static_cast<char*>(x); // 没有空格(< 和 >),在强制类型转换
// 中,在< 前面, 或者在 >( 之间也没有空格.
vector<char *> x; // 在类型和指针之间可以有空格,但是要保持前后一致
set<list<string>> x; // 允许出现在 C++11的代码中 .
set<list<string> > x; // C++03 required a space in > >.
set< list<string> > x; // 你也可以选择在list前面添加一个对称的空格
2 Vertical Whitespace(垂直留白)
link▽Minimize use of vertical whitespace.
最小化垂直留白。
相对应一条规则,这更是一条原则:当你不是必须要使用空白行时,请不用使用空白行。特别,在两个函数之间不要放超过一行或者两行的空白行,抵制以一个空白行作为函数的开始,以一个空白行作为函数的结束,但是,要区别对待在函数中使用空白行。
最基本的规则是:屏幕上显示的代码越多,越容易去跟踪和理解程序的控制流。当然,可读性也会由于代码太密或者太疏受到影响,所以需要你自己去判断。但是,一般来说,最小化使用垂直空白行。
一些经验法则能够帮助确定什么时候该用空白行:
一个函数的开头和结尾的空白行对可读性的帮助很小。
在if-else链块中的空白行可能对可读性有很好的帮助。
原文网址:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions