個人偏好各異,但**專案統一風格**能顯著降低閱讀理解成本。即便不同意某條規則,全專案遵循同一標準才是關鍵。
使用者介面文字勿硬編碼。特殊情況(解析外部資料分隔符、單元測試)可用 UTF-8 或十六進位逸出碼(如 "\xEF\xBB\xBF")。
設定編輯器自動將 Tab 轉為空格。MSVC 環境若習慣 Tab 可商議,但跨平台專案強制空格。
ReturnType ClassName::FunctionName(Type par1, Type par2) { // 全在同一行
DoSomething();
}
ReturnType ClassName::ReallyLongFunctionName( // 參數換行對齊
Type par1,
Type par2) { // 左大括號行尾
DoSomething(); // 縮排 2 格
}
關鍵規則:回傳型別與函式名同行、左括號緊貼函式名、參數無空格、左大括號行尾、右大括號獨立行、右括號與左大括號間一空格、參數名宣告/定義一致、參數對齊、預設縮排 2 格、獨立行參數縮排 4 格、const 與最後參數同行。
bool retval = DoSomething(arg1, arg2, arg3); // 優先同一行
bool retval = DoSomething(very_long_arg1, // 參數換行對齊第一個參數
arg2, arg3);
bool retval = DoSomething(arg1, // 多參數每行一個增強可讀性
arg2,
arg3);
if (condition) { // 括號內不加空格(推薦),關鍵字 if 後加空格
... // 2 格縮排
} else { // else 與右大括號同行
...
}
if 僅允許無 else 且簡單時:if (x == kFoo) return new Foo();switch (var) {
case 0: { // 可選用大括號建立區塊作用域
...; break;
}
default: { assert(false); }
}
while (condition) { } // 空主體用 {} 或 continue
for (int i=0; i<n; ++i) {} // 佳
while (condition); // 差:像 do-while
x = *p; p = &x; x = r.y; x = r->y; // . 和 -> 前後無空格,* & 後無空格
char *c; const string& str; // 宣告時 * & 貼型別或變數名皆可,但檔案內統一
char* c, *d, *e; // 連續宣告必須貼變數名
邏輯運算子 && 置於**行尾**,可選擇性加括號增強可讀性:
if (this_one > that &&
third == fourth &&
last_one) { ... }
return x; 而非 return(x);。
int x = 3; 或 int x(3);、string name("abc"); 或 string name = "abc"; 皆可,專案內統一即可。
if (cond) {
#if DISASTER_PENDING // 行首,不縮排
DropEverything();
#endif
}