條件編譯#ifdef MACRO_A和#if defined(MACRO_A)的區別
阿新 • • 發佈:2019-01-01
在查閱linux核心原始碼的過程中,發現存在兩種不同型別的條件編譯語句:#ifdef MACRO_A和#if defined(MACRO_A)或#if !defined(MACRO_A)
#ifdef和#ifdefined()之間的區別
實際上,兩者並無本質的差別,但後者的應用範圍更廣,能支援多個預編譯變數的檢查。
#if defined(MACRO_A) && !defined(MACRO_B)
#endif
如果用前者的方式來表達,只能使用巢狀的條件判斷#ifdef(MACRO_A) #ifndef(MACRO_B) ...; ...; #endif #endif
後來,在原始碼中又看到了這樣的條件語句:
#define CONFIG_RMII 0在c檔案中,這樣使用巨集定義:
#ifdef CONFIG_RMII
macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
#else
macb_writel(macb, USRIO, 0);
#endif
我的編譯結果是,不管將CONFIG_RMII設為0或1,編譯出來的二進位制檔案,除了編譯時間不同,其他都一樣。
這說明對該巨集的使用有誤。
從網上查了些資料,發現是對#if和#ifdef的區別不清楚所導致。
#if和#ifdef之間的區別
對於#if後面需要是一個表示式,如果表示式為1則呼叫#if下面的程式碼。
對於#ifdef後面需要的只是這個值有沒有用#define定義,並不關心define的這個值是0還是1。
要使得判別條件#ifdef結果為假,也就是不執行判別條件後面所跟的語句,需要對#ifdef後面所跟的巨集使用#undef語句進行宣告。