我有以下宏:
#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;
但是没有用。编译器返回给我:
Error[Pe017]: expected a "]"
我也一直在尝试其他方式,但没有成功。
我做错了什么?
最佳答案
整个宏用文字子表达式扩展,然后扩展结果表达式中的宏。
所以你可以这样写:
#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
的定义。另外请注意,宏标识符和以下划线开头的符号是为编译器保留的,因此您可能想重命名您的辅助标识符宏。)
关于c - c中其他宏串联内的宏串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848738/