1. 程式人生 > >條件編譯#ifdef MACRO_A和#if defined(MACRO_A)的區別

條件編譯#ifdef MACRO_A和#if defined(MACRO_A)的區別

在查閱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語句進行宣告。