具有定义符号的令牌连接 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 本身在重新扫描时扩展。