在写代码的时候需要用到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
请问下这是什么原因呢?
|