带有定义的 C 宏构建

标签 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

谁能指出我的错误?

谢谢

最佳答案

我会推荐 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) 将连接已展开的 xy

关于带有定义的 C 宏构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302769/

相关文章:

c - 在 Intel Edison 上运行简单的 C 示例

c read() 管道保持空闲

c - 在C中输入大字符串

在 C 中创建跟踪当前范围的宏

gwt - 有没有办法告诉 IntelliJ IDEA GWT 编译器使用哪个输出文件夹?

c - 父进程无法读取 C 中 4 个不同管道的所有消息

创建自定义队列

C++ 宏粘贴 : is it possible?

python - 使用宏从 __VA_ARGS__ 生成参数列表

ios - 如何在不使用对象或类方法的情况下调用另一个类的变量?