以下是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