小编use*_*408的帖子

我对##运算符缺少什么

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

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

更新

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

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

谢谢您的帮助.

c macros gcc texas-instruments c-preprocessor

7
推荐指数
1
解决办法
87
查看次数

标签 统计

c ×1

c-preprocessor ×1

gcc ×1

macros ×1

texas-instruments ×1