請將原始碼行的長度保持在 79 個字元或更少,以便在最廣泛的環境中獲得最大的可讀性。
將啟始 C 函數主體的左大括號放在第一欄非常重要,這樣它們就會啟動一個 defun。 有幾個工具會尋找第一欄中的左大括號來尋找 C 函數的開頭。 這些工具將無法在未以這種方式格式化的程式碼上運作。
當左大括號、左括號或左方括號在函數內部時,請避免將它們放在第一欄,這樣它們就不會啟動 defun。 如果您覺得將 struct
主體的定義視為 defun 很有用,則啟始 struct
主體的左大括號可以放在第一欄。
函數定義也將函數名稱放在第一欄也很重要。 這有助於人們搜尋函數定義,也可能幫助某些工具識別它們。 因此,使用標準 C 語法,格式如下
static char * concat (char *s1, char *s2) { … }
或者,如果您想使用傳統 C 語法,請像這樣格式化定義
static char * concat (s1, s2) /* Name starts in column one here */ char *s1, *s2; { /* Open brace in column one here */ … }
在標準 C 中,如果參數無法完美地放在一行上,請像這樣分割它
int lots_of_args (int an_integer, long a_long, short a_short, double a_double, float a_float) …
對於 struct
和 enum
類型,同樣將大括號放在第一欄,除非整個內容可以放在一行上
struct foo { int a, b; }
or
struct foo { int a, b; }
本節的其餘部分給出了我們對 C 格式化樣式的其他方面的建議,這也是 1.2 及更新版本中 indent
程式的預設樣式。 它對應於以下選項
-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob
我們不認為這些建議是要求,因為如果兩個不同的程式有不同的格式化樣式,對使用者不會造成任何問題。
但是,無論您使用哪種樣式,請保持一致地使用它,因為一個程式中混合使用多種樣式往往看起來很難看。 如果您要為現有程式貢獻變更,請遵循該程式的樣式。
對於函數主體,我們推薦的樣式如下所示
if (x < foo (y, z)) haha = bar[4] + 5; else { while (z) { haha += foo (z, z); z--; } return ++x + bar (); }
我們發現當程式在左括號之前和逗號之後有空格時,更容易閱讀。 尤其是在逗號之後。
當您將表達式分割成多行時,請在運算子之前分割,而不是在運算子之後分割。 這是正確的方法
if (foo_this_is_long && bar > win (x, y, z) && remaining_condition)
盡量避免在相同的縮排層級上出現兩個不同優先順序的運算子。 例如,不要這樣寫
mode = (inmode[j] == VOIDmode || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j]) ? outmode[j] : inmode[j]);
相反,使用額外的括號,以便縮排顯示巢狀結構
mode = ((inmode[j] == VOIDmode || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j]))) ? outmode[j] : inmode[j]);
插入額外的括號,以便 Emacs 可以正確縮排程式碼。 例如,如果您手動執行以下縮排,看起來會很棒,
v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000 + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;
但 Emacs 會更改它。 新增一組括號會產生看起來同樣美觀,並且 Emacs 會保留的東西
v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000 + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);
像這樣格式化 do-while 語句
do { a = foo (a); } while (a > 0);
請使用換頁符號 (control-L) 在邏輯位置將程式分成頁面(但不要在函數內)。 頁面有多長並不重要,因為它們不必適合列印頁面。 換頁符號應單獨出現在行中。