有人可以向我解释这两个宏吗?
#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 *。
答案 0 :(得分:2)
但offsetof返回的值不是指针。顾名思义,它是给定对象中字段的偏移量。它以字节为单位。 size_t看起来像是一个保持价值的优秀类型。
c中的指针算法很简单:p + n通过sizeof(* p)移动p。例如。如果p指向大小为8的对象,则p + 1将其移动8,使其指向下一个对象。
char 按照定义 1,因此char *指针上的所有指针运算都会移动1.因此,这里使用它来精确地移动从offsetof获得的数量。