1. 程式人生 > >結構體內的#define巨集定義

結構體內的#define巨集定義

關於巨集的作用域

1.     巨集沒有可見域。

        如果說有,那就是從本檔案(包括被包含的檔案)中,該巨集定義處開始,至檔案的尾部或取消巨集(#undef)為止。

2.     考慮一種特殊情況:

        一個巨集定義,如果寫在結構體之內,即使與結構體之外的巨集定義名字重複了最多是編譯警告。可是如果不在結構體之內,名字重複可肯定是error。(未證實,可以做實驗,而且可以把兩處的巨集定義成不同的值,會是什麼情況?)

        定義在結構體之內的巨集在結構體內可以隱藏定義在結構體之外定義的巨集,如果都在結構體之外定義,那麼就是定義了兩個相同的巨集,而一個在內,一個在外,則結構體內只看到內部定義的巨集,而結構體外只看到外部定義的巨集,跟變數的隱藏類似。

    巨集的處理是在編譯的預處理階段完成的。前處理器根本就不認識什麼結構體,在C語言編譯器編譯這個C檔案中的結構體時,這個define語句已經不存在了。相應的,用到這個巨集的地方,巨集本身也已經替換成巨集的值(這個巨集展開)。大家可以用gcc -E命令來只做預處理而不編譯,看看出來後的檔案。

    至於為什麼在結構體裡頭#deifne,是因為這個巨集一般用於定義該結構體裡頭的標誌位變數的可能的值,和結構體的這個變數密切相關。放在一起從邏輯上比較容易理解。