我很難理解C預處理器在以下上下文中如何應用重寫規則。我有以下宏:C預處理器宏擴展
#define _A(x) "A" _##x
#define _B(x) "B" _##x
#define X(x) _##x
的想法是,這些宏使用的連接來創建一個新的表達,其本身可以是一個宏觀 - 如果一個宏,我想這將擴大:現在
,下面的擴展,就像我期望:
X(x) expands to _x
X(A(x)) expands to "A" _x
X(A(B(x))) expands to "A" "B" _x
然而,一旦同宏多次使用,擴展停止:
X(A(A(x))) expands to "A" _A(x), expected "A" "A" _x
X(B(B(x))) expands to "B" _B(x), expected "B" "B" _x
X(A(B(A(x)))) expands to "A" "B" _A(x), expected "A" "B" "A" _x
X(A(B(A(B(x))))) expands to "A" "B" _A(B(x)), expected "A" "B" "A" "B" _x
我猜這裏有某種「只能擴展同名宏」的規則?我能做些什麼來讓宏按我想要的方式擴展嗎?
這是因爲您使用'##'運算符,它不評估宏;這是[嵌套宏擴展](https://stackoverflow.com/questions/31610231/nested-macro-expansion) –
或[如何評估嵌套的預處理器宏](https:// stackoverflow。com/questions/13074432/how-to-evaluate-an-nested-preprocessor-macro) –
也許我的大腦工作不正常,但我不明白這些問題是如何重複的。在你關聯的問題中,問題是首先擴展宏,然後再連接。我想完全相反:先連接然後展開。另外,至少有一些擴展正在發生,或者我發佈的示例根本不會擴展(例如,我們會得到X(A(x)) - _A(x),但是_A(x)顯然會擴展) – MrMobster