如何让C宏展开为另一宏的参数名?示例需求能否用C宏实现?
如何让宏展开为另一个宏的参数名?
你的需求可以通过C预处理器的间接宏展开实现,核心是利用预处理器的宏展开顺序规则,让参数先完成替换再展开目标宏。
问题原因
你给出的代码无法正常工作,是因为预处理器的展开顺序:当展开X(4)时,会先将X(b)替换为Y,此时Y里的b已经不属于X的参数范围,后续展开Y得到(b * 2),这里的b未被替换成4,最终代码会因未定义的b报错。
解决方法
添加一个中间宏触发二次展开,让参数先完成替换,再展开目标宏Y:
#define Y (b * 2) #define _EXPAND_Y(b) Y #define X(b) _EXPAND_Y(b) int main() { printf("%d", X(4)); // 输出8 }
展开过程解析
- 处理
X(4):将宏参数b替换为4,得到_EXPAND_Y(4) - 处理
_EXPAND_Y(4):将宏参数b替换为4,得到Y - 处理
Y:展开为(4 * 2),最终编译后计算结果为8
如果希望代码更清晰,也可以直接将Y定义为带参数的宏,这样无需中间层:
#define Y(b) (b * 2) #define X(b) Y(b) int main() { printf("%d", X(4)); // 输出8 }
内容的提问来源于stack exchange,提问作者Abdulmalek Almkainzi
相关产品推荐
相关产品推荐

