C宏建筑与定义

时间:2013-06-25 16:32:54

标签: c macros

我无法正确使用此宏扩展

#define foo Hello
#ifdef foo
#define wrapper(x) foo ## x
#else
#define wrapper(x) boo ## x
#endif

主叫:

wrapper(_world)

我想要

的结果
Hello_world

但是,宏将“foo”定义为文字,从而给出了

foo_world

有人可以指出我的错误吗?

由于

1 个答案:

答案 0 :(得分:7)

我建议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_1024XAFTERX不直接进行连接,因此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)会将xy连接起来,并且已经展开了。