当我将 container_of
宏应用于包含 char 数组的 C 结构时,我收到警告:从不兼容的指针类型初始化。
代码如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
struct st {
int a;
char b;
char c[16];
void *p;
};
int main(void)
{
struct st t = {
.a = 101,
.b = 'B',
.c = "hello",
.p = NULL
};
char (*p)[16] = &t.c;
struct st *s = container_of(p, struct st, c);
return 0;
}
看来__mptr
的类型是[]
,是由typeof()
推导出来的。然而,ptr
本身就是(*)[]
类型。显然,它们不一样。
此外,如果我用clang编译这段代码,一切都正常。 GCC 似乎对类型检查有更严格的规则。
问:如何纠正此警告?
最佳答案
__mptr
的声明没有用,因为它只是在下一行中转换为 char*
。只需将宏替换为:
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
注意:GCC 6.2.0 没有对原始代码发出任何警告,除非未使用的变量 s
。
关于c - 将container_of宏应用于嵌入的char数组时报告警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961293/