我对##运算符缺少什么

时间:2013-10-30 22:58:10

标签: c gcc macros c-preprocessor texas-instruments

在尝试处理某些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编译器允许它?我猜这个答案就像“规范的模糊部分”。

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

更新

我认为问题是因为有许多嵌套宏可能无法完全解析。编译器最终得到的结果是无效的,因此它会在处理它们的某个时刻吐出虚拟对象。

我设法通过填写丢失的宏来解决问题,并导致其他部分崩溃。这就是我想平台和编译器之间移植代码的乐趣。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

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