在linux kernel中, container_of的定义如下:
其作用是根据结构体类型、它的一个成员地址及该成员名称来获取该结构体的起始地址。 其中, typeof 是GNU C对标准C的一个扩展,用于获取指定变量的数据类型。 此外用到了另外一个宏定义:
offsetof 获取结构体成员在结构体内部的偏移。它的实现很巧妙,即将0x0位置当做一个TYPE类型的结构体,此时结构体的成员地址也就是其结构体内部地址了。
理解了typeof 和 offsetof, container_of的实现也就很容易理解了。 精巧高效的实现,不得不佩服!
图片来源于:http://www.embedu.org/Column/Column433.htm