c中其他宏连接内的宏连接

时间:2015-04-24 13:26:25

标签: c concatenation

我有以下宏:

#define    __IR( x )        ICU.IR[ IR ## x ].BIT.IR
#define     _IR( x )        __IR( x )
#define      IR( x , y )    _IR( _ ## x ## _ ## y )

我以这种方式使用它:

IR(SCI7, RXI7) = 0;

扩展为:

ICU.IR[ IR_SCI7_RXI7 ].BIT.IR = 0

我不想使用SCI7RXI7,而是使用sci(channel)rxi(channel)。所以我试图创建以下宏:

#define _sci(x)  SCI ## x
#define  sci(x)  _sci(x)
#define _rxi(x)  RXI ## x
#define  rxi(x)  _rxi(x)

#define channel 7

然后:

IR(sci(channel), rxi(channel)) = 0;

但它没有用。编译器返回我:

  

错误[Pe017]:预期为“]”

我一直在尝试其他方式,但没有成功。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

使用文字子印象扩展整个宏,然后扩展结果表达式中的宏。

所以你可以写:

#define    __IR(x )      ICU.IR[ IR ## x ].BIT.IR
#define     _IR(x, y)    __IR(_ ## x ## _ ## y)
#define      IR(x, y)    _IR(x, y)

#define _sci(x)  SCI ## x
#define  sci(x)  _sci(x)
#define _rxi(x)  RXI ## x
#define  rxi(x)  _rxi(x)

#define channel 7

IR(sci(channel), rxi(channel)) = 0;

(我唯一真正改变的是_IR的定义。另外,对于编译器,保留了以下划线开头的宏标识符和symbold,因此您可能希望重命名辅助宏。)

答案 1 :(得分:2)

你错误地认为宏函数就像一个函数调用,而它实际上涉及源代码上的文本替换。

粗略地说,预处理器会将IR(sci(channel), rxi(channel)) = 0扩展为_IR( _sci(channel)_rxi(channel)) = 0并将其扩展为ICU.IR[IR_sci(channel)_rxi(channel)].BIT.IR = 0。然后将所有结果编译为C。

方括号之间的位根本不是有效的C表达式。编译器对此感到困惑,因此产生了神秘的错误消息。

这就是问题的解释。解决方案?您没有提供足够的信息来帮助任何人建议。