当尝试处理某些TI代码中的某些宏时,我在GCC中遇到编译器错误,这些代码可以通过TI编译器进行编译.
有问题的宏是一些变体
#define CHIP_FSET(Reg,Field,Val) _CHIP_##Reg##_FSET(##Field,Val)
Run Code Online (Sandbox Code Playgroud)
它在代码中使用
CHIP_FSET(ST1_55, XF, CHIP_ST1_55_XF_OFF)
Run Code Online (Sandbox Code Playgroud)
当海湾合作委员会得到它所说的时候
错误:粘贴"("和"XF"不提供有效的预处理令牌
如果我删除Field前面的##,它会成功预处理.如果我正确理解代码,字段前面的##似乎无关紧要,因为它变成了一个带有两个参数的函数调用(或另一个宏调用).所以##是多余的,原来的替换将导致...... _ FSET(Field,Val)无论如何.
那我错过了什么?我在##预处理器指令上找到的所有内容都表示它只是将文本粘在一起.所以##在这种情况下从来没有做过任何事情.
我错过了什么?
为什么GCC会扼杀它,但TI编译器允许它?我猜这个答案就像"规范的模糊部分".
=========================
更新
我认为问题是因为有许多嵌套宏可能无法完全解析.编译器最终得到的结果是无效的,因此它会在处理它们的某个时刻吐出虚拟对象.
我设法通过填写丢失的宏来解决问题,并导致其他一些部分破坏.这就是我想平台和编译器之间移植代码的乐趣.
谢谢您的帮助.