我很难理解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