下一步: , 向上: 撰寫 C   [目錄][索引]


5.1 格式化您的原始碼

請將原始碼行的長度保持在 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)
…

對於 structenum 類型,同樣將大括號放在第一欄,除非整個內容可以放在一行上

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) 在邏輯位置將程式分成頁面(但不要在函數內)。 頁面有多長並不重要,因為它們不必適合列印頁面。 換頁符號應單獨出現在行中。


下一步: , 向上: 撰寫 C   [目錄][索引]