宏容器中的0是什么意思?

时间:2015-10-29 12:33:57

标签: c

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

宏容器中的'0'对我来说完全不为人知。它是c的语法还是某种gcc扩展名?

希望是一个更简单的例子来解释这个'0'。

1 个答案:

答案 0 :(得分:3)

这实际上是implementation defined behaviour。它会向指针强制转换整数。请注意,这是一个null pointer constant,因为它不会转换为void *,而是另一种类型。

强制转换有效地在地址0处生成指向类型为type的对象的指针。由于从未访问过,因此这不是未定义的行为。原因是为以下offsetof生成引用对象,并向宏添加一些类型检查。

AFAIK,宏是来自Linux内核并且大量使用(我自己在自己的代码中使用它 - 非常有用,谢谢你们!)。它使用了一些gcc扩展,但它是块表达式(parethetised花括号)和typeof,而不是强制转换。

Here详细描述了宏的作用。