#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) );})
理解这段宏必须先理解在C语音中({})代表什么意思,The GNU C Reference Manual中有这么一段例子:
({ int y = function (); int z; if (y > 0) z = y; else z = - y; z; })其值为z,即最后一个表达式的值,并且The GNU C Reference Manual中提到了当知道a,b类型的情况下(通过typeof()函数可以知道,这里假设为int)
#define maxint(a,b) \ ({int _a = (a), _b = (b); _a > _b ? _a : _b; })这种定义方式要比
#define max(a,b) ((a) > (b) ? (a) : (b))这种方式要好,因为在 #define max(a,b) ((a) > (b) ? (a) : (b))中,a,b都计算了两次,不清楚的话,假设一下传入的是x++等类型的就知道了。
好了,解释到这里,最前那段宏定义也自然就明白了,typeof返回的就是其包含的类型,const typeof( ((type *)0)->member ) *__mptr = (ptr); 定义了一个数据结构成员类型的变量指针, (char *)__mptr - offsetof(type,member) 意思就是成员地址值减去成员偏移量(转成char*指针是利用了指针加减运算),自然就是结构体第一个成员所在的地址了,也就是结构体变量本身的地址了,因此就可以求得哪个变量包含了该成员。