下一節: , 上一節: , 上一層: 撰寫 C 程式碼   [目錄][索引]


5.3 C 結構的清晰使用

請明確宣告所有物件的型別。例如,您應該明確宣告函數的所有參數,並且應該宣告函數回傳 int,而不是省略 int

有些程式設計師喜歡使用 GCC 的 ‘-Wall’ 選項,並在每次發出警告時修改程式碼。如果您想這樣做,那就去做。其他程式設計師則偏好不使用 ‘-Wall’,因為它會對有效且合法的程式碼發出警告,而他們不想修改這些程式碼。如果您想這樣做,那就去做。編譯器應該是您的僕人,而不是您的主人。

不要為了安撫靜態分析工具(例如 lintclang 和 GCC,以及額外的警告選項,例如 -Wconversion-Wundef)而使程式變得醜陋。這些工具可以幫助找到錯誤和不清楚的程式碼,但它們也可能產生大量誤報,以至於為了透過不必要的型別轉換、包裝函式和其他複雜化來消除這些誤報,反而損害了可讀性。例如,請不要僅僅為了安撫 lint 檢查器而插入轉換為 void 的型別轉換或呼叫無效函數。

外部函數和稍後出現在原始碼檔案中的函數的宣告都應該放在檔案開頭附近的一個位置(在檔案中的第一個函數定義之前),或者應該放在標頭檔中。不要將 extern 宣告放在函數內部。

過去,在一個函數中,為了不同的值重複使用相同的區域變數(名稱如 tem)是很常見的做法。與其這樣做,不如為每個不同的目的宣告一個單獨的區域變數,並給它一個有意義的名稱。這不僅使程式更容易理解,而且還有利於優秀編譯器的最佳化。您也可以將每個區域變數的宣告移動到包含其所有用途的最小作用域中。這使程式碼更加清晰。

不要使用會遮蔽全域識別符的區域變數或參數。GCC 的 ‘-Wshadow’ 選項可以偵測到這個問題。

不要在跨越多行的單一宣告中宣告多個變數。相反地,在每一行開始一個新的宣告。例如,不要這樣寫

int    foo,
       bar;

而是寫成這樣

int foo, bar;

或這樣寫

int foo;
int bar;

(如果它們是全域變數,無論如何每個都應該在前面加上註解。)

當您在另一個 if 語句中巢狀 if-else 語句時,始終在 if-else 周圍加上大括號。因此,永遠不要這樣寫

if (foo)
  if (bar)
    win ();
  else
    lose ();

始終這樣寫

if (foo)
  {
    if (bar)
      win ();
    else
      lose ();
  }

如果您在 else 語句內巢狀 if 語句,可以將 else if 寫在同一行,像這樣,

if (foo)
  …
else if (bar)
  …

then 部分的縮排方式與前面的 then 部分相同,或者將巢狀 if 寫在大括號內,像這樣

if (foo)
  …
else
  {
    if (bar)
      …
  }

不要在同一個宣告中同時宣告結構標籤和變數或 typedef。相反地,請單獨宣告結構標籤,然後使用它來宣告變數或 typedef。

盡量避免在 if 條件式中賦值(while 條件式中的賦值是可以接受的)。例如,不要這樣寫

if ((foo = (char *) malloc (sizeof *foo)) == NULL)
  fatal ("virtual memory exhausted");

而是這樣寫

foo = (char *) malloc (sizeof *foo);
if (foo == NULL)
  fatal ("virtual memory exhausted");

下一節: , 上一節: , 上一層: 撰寫 C 程式碼   [目錄][索引]