有人可以向我解释container_of中的类型返回吗?

时间:2017-10-27 02:49:28

标签: c linux linux-kernel linux-device-driver

有人可以向我解释这两个宏吗?

#define offsetof(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) );})

我理解除了为什么offset_of是(size_t)而container_of有(char *)之外的一切?

(char *) - (size_t)如何在这个宏中工作?

我希望他们两个都属于同一类型。比如char *。

1 个答案:

答案 0 :(得分:2)

但offsetof返回的值不是指针。顾名思义,它是给定对象中字段的偏移量。它以字节为单位。 size_t看起来像是一个保持价值的优秀类型。

c中的指针算法很简单:p + n通过sizeof(* p)移动p。例如。如果p指向大小为8的对象,则p + 1将其移动8,使其指向下一个对象。

char 按照定义 1,因此char *指针上的所有指针运算都会移动1.因此,这里使用它来精确地移动从offsetof获得的数量。