C 预处理器宏扩展

MrM*_*ter 4 c macros c-preprocessor

我很难理解 C 预处理器在以下上下文中如何应用重写规则。我有以下宏:

\n\n
#define _A(x) "A" _##x\n#define _B(x) "B" _##x\n#define X(x) _##x\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个想法是,每个宏都使用串联来创建一个新表达式,它本身可以是一个宏 \xe2\x80\x94 如果它是一个宏,我希望它被扩展:

\n\n

现在,以下内容正如我所期望的那样展开:

\n\n
X(x)       expands to _x\nX(A(x))    expands to "A" _x\nX(A(B(x))) expands to "A" "B" _x\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,一旦多次使用同一个宏,扩展就会停止:

\n\n
X(A(A(x)))       expands to "A" _A(x), expected "A" "A" _x\nX(B(B(x)))       expands to "B" _B(x), expected "B" "B" _x\nX(A(B(A(x))))    expands to "A" "B" _A(x), expected "A" "B" "A" _x \nX(A(B(A(B(x))))) expands to "A" "B" _A(B(x)), expected "A" "B" "A" "B" _x \n
Run Code Online (Sandbox Code Playgroud)\n\n

我猜想这里存在某种“只能扩展同名宏一次”规则?我可以做些什么来让宏按照我想要的方式扩展吗?

\n

Jim*_*mbo 5

当我想计算宏扩展时,我通常使用这个图,它是我使用标准中的第 6.10.3 节构建的。希望能帮助到你...

在此输入图像描述

正如托比已经提到的,嵌套宏不会递归扩展。