我无法正确执行此宏扩展
#define foo Hello
#ifdef foo
#define wrapper(x) foo ## x
#else
#define wrapper(x) boo ## x
#endif
调用:
wrapper(_world)
我想要的结果
Hello_world
但是,宏将“foo”定义视为文字,因此给出
foo_world
谁能指出我的错误?
谢谢
最佳答案
我会推荐 gnu-cpp-manual这清楚地解释了宏是如何展开的。
宏参数在被代入宏体之前是完全宏扩展的,除非它们(宏参数)被字符串化或粘贴有其他标记(由宏函数直接适用于)。
例如:
如果参数被字符串化或串联,则不会发生预扫描。
#define AFTERX(x) X_ ## x
#define XAFTERX(x) AFTERX(x)
#define TABLESIZE 1024
#define BUFSIZE TABLESIZE
AFTERX(BUFSIZE) => X_BUFSIZE
:由于AFTERX
是将参数与前缀连接起来,它的参数没有扩展,保持BUFSIZE
。
XAFTERX(BUFSIZE) => X_1024
:XAFTERX
不直接做拼接,所以BUFSIZE
先展开
一般来说,参数会被扫描两次以扩展其中调用的宏。
--- 编辑---
所以更好的做法是:(代码来自 QEMU 来源)
#ifndef glue
#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)
#define stringify(s) tostring(s)
#define tostring(s) #s
#endif
glue(x,y)
将连接已展开的 x
和 y
。
关于带有定义的 C 宏构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302769/