此宏没有按照我的预期进行扩展,我有以下宏(源于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”
因此宏正在对实际符号而不是我定义的值进行字符串化,我该如何解决呢?
答案 0 :(得分:2)
因此宏正在对实际符号而不是我定义的值进行字符串化
是的,这是令牌粘贴运算符的指定行为。在粘贴之前,不会对它们的操作数进行 not 宏扩展。如果粘贴在一起的结果是一个宏名称,那么它将在重新扫描时扩展。
,我该如何解决?
由于您无法修改SRU
宏,因此最好的解决方法可能是包装它,这应该非常简单:
#define MY_SRU(out,in) SRU(out,in)
由于它们不是##
或#
运算符的操作数,因此MY_SRU
的参数将被完全宏扩展。使用扩展的参数对SRU
进行的调用本身会在重新扫描时扩展。