我有以下宏:
#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
我不想使用SCI7
和RXI7
,而是使用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]:预期为“]”
我一直在尝试其他方式,但没有成功。
我做错了什么?
答案 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表达式。编译器对此感到困惑,因此产生了神秘的错误消息。
这就是问题的解释。解决方案?您没有提供足够的信息来帮助任何人建议。