2010-11-26 94 views
13

我的預處理器工作原理的心理模型顯然不完整,這使我瘋狂。預處理器令牌擴展

我想連接兩個標記,但第一個標記應該先展開。

#define ANSWER 42 

#define FOO foo_ ## ANSWER 

這裏,FOO擴展爲foo_ANSWER,但我希望它是foo_42。所以,我在希望,這會在一定程度連接前擴大參數定義MERGE宏:

#define MERGE(x, y) x ## y 

#define BAR MERGE(bar_, ANSWER) 

BAR還擴展到bar_ANSWER,而不是bar_42。所以我定義另一個宏HELPER

#define HELPER(x, y) MERGE(x, y) 

#define BAZ HELPER(baz_, ANSWER) 

現在BAZ成功地擴展到baz_42。目前,這對我來說似乎很神奇。

任何人都可以向我解釋這種行爲?擴展規則如何正確工作?

+0

我很抱歉地說,我還提出了同樣問題的可能重複的問題。我想知道爲什麼這種行爲沒有明確記錄。我的意思是預處理器運行的算法。 – 2013-05-16 20:57:22

+0

@sandundhammika:它在規範中有相當清楚的記載 - 第6.10.3節 - 雖然有一些未定義的行爲角落。 – 2015-04-18 19:14:38

回答

7

閱讀回答你的問題here

的問題是,當你有一個 宏替換,預處理 將不僅擴大了宏 遞歸如果既字符串化 操作#也不令牌-opesting operator ##應用於它。所以,你 必須使用 間接的一些額外的圖層,可以使用 標記粘貼的操作與 遞歸擴展參數

3

令牌級聯串接執行時[ref]不展開宏。

爲了克服這個問題,您需要使用間接級別,並讓預處理器在連接之前展開宏。

#define STEP1(x, y) STEP2(x, y) // x and y will be expanded before the call to STEP2 
#define STEP2(x, y) x ## y   // x and y will not be expanded, just pasted