我的 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/