c - 如何将一个宏的结果传递给另一个宏?

标签 c macros c-preprocessor

我的 C 代码中有两个宏可以帮助我编写某些变量的名称。例如,请考虑以下情况:

#define MACROA(name) A_##name
#define MACROB(name) B_##name

void *MACROB(MACROA(object));

因此,我尝试声明一个名为 B_A_object 的变量。但是,这不起作用,编译器会向我抛出以下消息:

object.c:27:21: error: a parameter list without types is only allowed in a function definition
void *MACROB(MACROA(object));
                    ^
object.c:26:26: note: expanded from macro 'MACROB'
#define MACROB(name) B_##name
                         ^

因此,预处理器似乎没有获取 MACROA(object) 的结果,但它正在考虑表达式本身,以便尝试生成 B_MACROA(object) >。那么,我必须做什么才能使预处理器考虑传递给另一个宏的宏的结果?

最佳答案

连接运算符的行为很奇怪。它首先连接,然后评估:

void *MACROB(MACROA(object));  // The original line
void *B_MACROA(object);       // Becomes this, nothing more to expand

可以这样解决:

#define CONC(a,b) a ## b
#define MACROA(name) CONC(A_, name)
#define MACROB(name) CONC(B_, name)

关于c - 如何将一个宏的结果传递给另一个宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17595470/

相关文章:

c - 有没有办法在不使用 c 中具有全局或模块范围的变量的情况下持久存储值?

c - 这个 "#define CONCAT_3(p1, p2, p3) p1##p2##p3"宏定义是什么意思?

c - 如何控制C宏优先级

c - 头文件的排除是否是语法错误的一部分?

C 预处理器 - 在编译时向结构体添加元素

c - 使用 fgets 读取元素并将其插入到基于数组的列表中 C

Xcode 中的 C 程序

c - 通过c中的函数传递文件

rust - 如何编写将一个字节拆分为用户指定计数的位元组的宏?

在 C 中跨多个源文件创建调度表注册函数