我在##运算符中丢失了什么

在尝试处理TI编译好的TI代码中的某些宏时,我遇到了GCC的编译器错误。

宏观的问题是一些变化

#define CHIP_FSET(Reg,Field,Val)     _CHIP_##Reg##_FSET(##Field,Val)

它用于代码中

CHIP_FSET(ST1_55, XF, CHIP_ST1_55_XF_OFF)

当海湾合作委员会认为它说

错误:粘贴“(”和“XF”不提供有效的预处理令牌

如果我删除Field前面的##,它会成功预处理。 如果我正确理解代码,则字段前面的##似乎不相关,因为它变成了一个带有两个参数的函数调用(或另一个宏调用)。 所以##是多余的,原来的替换将导致...... FSET(Field,Val)。

那么我错过了什么? 我在##预处理器指令中找到的所有内容都表明它只是将文本粘在一起。 所以在这种情况下,##从来没有做过任何事情。

我错过了什么?

为什么GCC会扼杀它,但TI编译器允许它? 我猜这个答案就像“规范中不明确的部分”。

=========================

更新

我认为这个问题是因为有大量的嵌套宏可能没有完全解决。 编译器最终的结果是无效的,所以它在处理它们时会在某个时刻吐出假人。

我已经设法通过填充缺失的宏来使问题变得更糟,并导致其他一些部分中断。 我猜想,在平台和编译器之间移植代码是很愉快的。

谢谢您的帮助。


没有规格不含糊。 ##运行在令牌的层面。 要求粘贴在一起的两个令牌必须再次形成有效的令牌。 (不会形成带有字母字符的标记,因此是错误消息。

链接地址: http://www.djcxy.com/p/75223.html

上一篇: What am I missing with the ## operator

下一篇: Mock private method in the same class that is being tested