#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
宏容器中的'0'对我来说完全不为人知。它是c的语法还是某种gcc扩展名?
希望是一个更简单的例子来解释这个'0'。
答案 0 :(得分:3)
这实际上是implementation defined behaviour。它会向指针强制转换整数。请注意,这是不一个null pointer constant,因为它不会转换为void *
,而是另一种类型。
强制转换有效地在地址0处生成指向类型为type
的对象的指针。由于从未访问过,因此这不是未定义的行为。原因是为以下offsetof
生成引用对象,并向宏添加一些类型检查。
AFAIK,宏是来自Linux内核并且大量使用(我自己在自己的代码中使用它 - 非常有用,谢谢你们!)。它使用了一些gcc扩展,但它是块表达式(parethetised花括号)和typeof
,而不是强制转换。
Here详细描述了宏的作用。