打印
[C语言]

使用宏定义的函数报错

[复制链接]
662|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzhiyang|  楼主 | 2020-6-19 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在写代码的时候需要用到linux里面的container_of函数,于是将其拷贝到我的代码里,
#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({          \
        const typeof(((type *)0)->member)*__mptr = (ptr);    \
                     (type *)((char *)__mptr - offsetof(type, member)); })


使用如下:
I2CDrvCtrl *drvCtrl = NULL;

下面函数调用里面第一个smid,类型为unsigned long,由上层函数利用drvCtrl->smid传进来的,第二个smid是类型为I2CDrvCtrl结构体里面的一个成员变量定义。
drvCtrl = container_of(&smid, I2CDrvCtrl, smid);
编译的时候报错:error #29: expected an expression
    drvCtrl = container_of(&smid, I2CDrvCtrl, smid);
                 ^


我很奇怪,我在codeblocks里面测试没问题的,刚开始怀疑编译器不一样,于是继续查原因:
由于container_of的第一句只是防错的,于是我将其去掉,修改宏定义如下:
#define container_of(ptr, type, member) ((type *)((char *)ptr - offsetof(type, member)))

编译通过,后来怀疑是typeof的问题,将其修改成__typeof__还是不行,于是想到是不是typeof这个关键字不识别。

于是修改成如下:
#define container_of(ptr, type, member) ({          \
                    unsigned long* __mptr = (ptr);    \
                     (type *)((char *)__mptr - offsetof(type, member)); })

再次编译还是报error #29: expected an expression

请问下这是什么原因呢?




使用特权

评论回复

相关帖子

沙发
john_lee| | 2020-6-20 10:00 | 只看该作者
还是编译器的问题,({ ... }) 的语法是GCC的扩展,你的编译器可能不支持。

使用特权

评论回复
板凳
huzhiyang|  楼主 | 2020-6-22 10:55 | 只看该作者
john_lee 发表于 2020-6-20 10:00
还是编译器的问题,({ ... }) 的语法是GCC的扩展,你的编译器可能不支持。

非常感谢啊,用的是ghs_ppc的编译工具,估计确实是编译工具的问题吧,已经因为这个浪费一下午了,不折腾了,就去掉宏的第一行使用了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

190

帖子

2

粉丝