C 我的###接线员遗漏了什么

C 我的###接线员遗漏了什么,c,gcc,macros,c-preprocessor,texas-instruments,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) 当GCC得到这个信息时,它会说 错误:粘贴“(”和“XF”不提供有效的预处理令牌 如果我删除前面的###字段,它将成功预处理。如果我正确理解了代码,前面

当我试图处理一些TI代码中的宏时,GCC出现了一个编译器错误,这些代码可以用TI编译器编译

所讨论的宏是

#define CHIP_FSET(Reg,Field,Val)     _CHIP_##Reg##_FSET(##Field,Val)
它被用在类似于

CHIP_FSET(ST1_55, XF, CHIP_ST1_55_XF_OFF)
当GCC得到这个信息时,它会说

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

如果我删除前面的###字段,它将成功预处理。如果我正确理解了代码,前面的##字段似乎无关紧要,因为它被转换为带两个参数的函数调用(或另一个宏调用)。因此##是冗余的,最初的替换将导致…#FSET(Field,Val)

那么我遗漏了什么呢?我在预处理器指令上找到的所有东西都说它只是把文本粘在一起了。所以在这种情况下,#从一开始就没有做过任何事情

我错过了什么

为什么GCC会扼杀它,但TI编译器允许它呢?我猜答案是“规范的不明确部分”

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

更新

我认为问题是因为有很多嵌套宏可能无法完全解决。编译器最终得到的结果是无效的,因此在处理所有宏时,它会在某个时候抛出伪宏

我设法通过填充丢失的宏使问题变得更糟,并导致其他部分损坏。我想这就是在平台和编译器之间移植代码的乐趣


感谢您的帮助。

不,规范没有歧义。
##
在令牌级别上运行。粘贴在一起的两个令牌必须再次形成有效令牌。
不会形成带有字母字符的标记,因此会显示错误消息。

是否可能是
#
(字符串化)函数调用中的运算符?我不确定。这不能解释为什么它在TI编译器上工作。谢谢。那么为什么旧的编译器会接受它?令人困惑的是,为什么一开始就这么做?除了把它们粘在一起,还会做更多的事吗?