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

时间:2013-07-11 14:01:09

标签: 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)。那么,我需要做些什么才能让预处理器考虑将宏的结果传递给另一个宏?

1 个答案:

答案 0 :(得分:3)

连接运算符很奇怪。它首先连接并稍后评估:

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)