具有定义符号C的令牌串联

时间:2018-08-09 21:57:32

标签: c c-preprocessor

此宏没有按照我的预期进行扩展,我有以下宏(源于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”

因此宏正在对实际符号而不是我定义的值进行字符串化,我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

  

因此宏正在对实际符号而不是我定义的值进行字符串化

是的,这是令牌粘贴运算符的指定行为。在粘贴之前,不会对它们的操作数进行 not 宏扩展。如果粘贴在一起的结果是一个宏名称,那么它将在重新扫描时扩展。

  

,我该如何解决?

由于您无法修改SRU宏,因此最好的解决方法可能是包装它,这应该非常简单:

#define MY_SRU(out,in) SRU(out,in)

由于它们不是###运算符的操作数,因此MY_SRU的参数将被完全宏扩展。使用扩展的参数对SRU进行的调用本身会在重新扫描时扩展。