具有定义符号的令牌连接 C
token concatenation with defined symbols C
这个宏没有像我想的那样扩展,我有以下宏(来源来自 Analog Devices,所以我无法更改):
#define SRU(out,in) \
r0=dm(in##_REG); \
r1=sru_mask(out,in); \
r0=r0 and r1; \
r1=sru_field(out,in); \
r0=r0 or r1; \
dm(in##_REG)=r0;
通常你会用它作为
SRU (LOW, DAI_PB14_I);
但是我想创建一个硬件配置头所以我定义了:
#define DTS_SEL_DSP_I DAI_PB14_I
所以上面的用法是:
SRU (LOW, DTS_SEL_DSP_I);
但是我得到了错误
error: identifier "DTS_SEL_DSP_I_REG" is undefined
应该是"DAI_PB14_I_REG"
所以宏将实际符号而不是我定义的值字符串化,我该如何解决这个问题?
So the macro is stringifying the actual symbol and not the value I defined
是的,这是令牌粘贴运算符的指定行为。它的操作数在粘贴在一起之前是 not 宏展开的。如果粘贴在一起的结果是一个宏名称,那么它将在重新扫描时展开。
, how can I get around this?
由于您无法修改 SRU
宏,最好的解决方法可能是将其包装起来,这应该非常简单:
#define MY_SRU(out,in) SRU(out,in)
因为它们不是 ##
或 #
运算符的操作数,所以 MY_SRU
的参数将被完全宏扩展。使用扩展参数调用 SRU
本身在重新扫描时扩展。
这个宏没有像我想的那样扩展,我有以下宏(来源来自 Analog Devices,所以我无法更改):
#define SRU(out,in) \
r0=dm(in##_REG); \
r1=sru_mask(out,in); \
r0=r0 and r1; \
r1=sru_field(out,in); \
r0=r0 or r1; \
dm(in##_REG)=r0;
通常你会用它作为
SRU (LOW, DAI_PB14_I);
但是我想创建一个硬件配置头所以我定义了:
#define DTS_SEL_DSP_I DAI_PB14_I
所以上面的用法是:
SRU (LOW, DTS_SEL_DSP_I);
但是我得到了错误
error: identifier "DTS_SEL_DSP_I_REG" is undefined
应该是"DAI_PB14_I_REG"
所以宏将实际符号而不是我定义的值字符串化,我该如何解决这个问题?
So the macro is stringifying the actual symbol and not the value I defined
是的,这是令牌粘贴运算符的指定行为。它的操作数在粘贴在一起之前是 not 宏展开的。如果粘贴在一起的结果是一个宏名称,那么它将在重新扫描时展开。
, how can I get around this?
由于您无法修改 SRU
宏,最好的解决方法可能是将其包装起来,这应该非常简单:
#define MY_SRU(out,in) SRU(out,in)
因为它们不是 ##
或 #
运算符的操作数,所以 MY_SRU
的参数将被完全宏扩展。使用扩展参数调用 SRU
本身在重新扫描时扩展。