考虑如下两个结构:
struct data { int something;};struct container { int something_before; struct data data_item; int something_after;};假设您有一个指向
struct data值的指针:
struct data *data_ptr;
该
list_entry()宏可以帮助你转换
data_ptr到一个指针
struct container保存的值
structdata值,指向
ptr:
struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);
宏作品通过计算的偏移量
data_item内的
struct container,并从中减去很多字节
data_ptr指针。当将
structcontainer *其强制转换为时,会给出指向
struct container持有此特定
struct data“内部”的的有效指针。
也可以使用内置
offsetof()宏来简化该宏:
#define list_entry(ptr, type, member) ((type *)((char *)(ptr) – offsetof(type, member)))



