我在##运算符中丢失了什么
在尝试处理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编译器允许它? 我猜这个答案就像“规范中不明确的部分”。
=========================
更新
我认为这个问题是因为有大量的嵌套宏可能没有完全解决。 编译器最终的结果是无效的,所以它在处理它们时会在某个时刻吐出假人。
我已经设法通过填充缺失的宏来使问题变得更糟,并导致其他一些部分中断。 我猜想,在平台和编译器之间移植代码是很愉快的。
谢谢您的帮助。
没有规格不含糊。 ##
运行在令牌的层面。 要求粘贴在一起的两个令牌必须再次形成有效的令牌。 (
不会形成带有字母字符的标记,因此是错误消息。
上一篇: What am I missing with the ## operator
下一篇: Mock private method in the same class that is being tested