上一個:,上一層:設計建議   [目錄][索引]


3.5 條件編譯

當支援在建置程式時已知的組態選項時,我們偏好使用 if (...) 而非條件編譯,因為在前者的情況下,編譯器能夠對所有可能的程式碼路徑執行更廣泛的檢查。

例如,請撰寫

  if (HAS_FOO)
    ...
  else
    ...

而非

  #ifdef HAS_FOO
    ...
  #else
    ...
  #endif

像是 GCC 這樣的現代編譯器,在這兩種情況下都會產生完全相同的程式碼,而且我們在幾個專案中成功地使用了類似的技術。當然,前一種方法假設 HAS_FOO 定義為 0 或 1。

雖然這不是解決所有可移植性問題的萬靈丹,且並非總是適用,但遵循這個政策本可以為 GCC 開發人員每年節省許多小時,甚至數天。

針對像是 GCC 中 REVERSIBLE_CC_MODE 這樣的函式型巨集,由於它不能簡單地在 if (...) 語句中使用,因此有一個簡單的變通方法。只要引入另一個巨集 HAS_REVERSIBLE_CC_MODE,如下例所示。

  #ifdef REVERSIBLE_CC_MODE
  #define HAS_REVERSIBLE_CC_MODE 1
  #else
  #define HAS_REVERSIBLE_CC_MODE 0
  #endif