在尝试处理某些TI代码中的某些宏时,我遇到了GCC的编译器错误,这些代码可以通过TI编译器进行编译。
有问题的宏是
的一些变体#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编译器允许它?我猜这个答案就像“规范的模糊部分”。
=========================
更新
我认为问题是因为有许多嵌套宏可能无法完全解析。编译器最终得到的结果是无效的,因此它会在处理它们的某个时刻吐出虚拟对象。
我设法通过填写丢失的宏来解决问题,并导致其他部分崩溃。这就是我想平台和编译器之间移植代码的乐趣。
感谢您的帮助。
答案 0 :(得分:4)
没有规格不含糊。 ##
在令牌级别上运行。要求粘贴在一起的两个令牌必须再次形成有效令牌。 (
不会形成带有字母字符的令牌,因此会显示错误消息。