【问题标题】:How to pass a macro's result to another macro?如何将宏的结果传递给另一个宏?
【发布时间】:2013-07-11 14:01:08
【问题描述】:

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

【问题讨论】:

  • 如果这不是为了学习/测试目的,你应该尽量避免它。
  • @Xaqq 不,不幸的是我必须遵循两个宏强加的命名约定......

标签: c macros c-preprocessor


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多