當支援在建置程式時已知的組態選項時,我們偏好使用 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