user/include/linux/list.h
此声明:
#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))
有人可以解释一下这是什么以及它是如何工作的,在此先感谢
PS请尽可能简化您的答案,我了解Linux中的线程,进程,现在我正在探索各种可能性,而我对此有些犹豫。
考虑如下两个结构:
struct data { int something; }; struct container { int something_before; struct data data_item; int something_after; };
假设您有一个指向struct data值的指针:
struct data
struct data *data_ptr;
该list_entry()宏可以帮助你转换data_ptr到一个指针struct container保存的值struct data值,指向ptr:
list_entry()
data_ptr
struct container
ptr
struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);
宏作品通过计算的偏移量data_item内的struct container,并从中减去很多字节data_ptr指针。当将struct container *其强制转换为时,会给出指向struct container持有此特定struct data“内部”的的有效指针。
data_item
struct container *
也可以使用内置offsetof()宏来简化该宏:
offsetof()
#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr) – offsetof(type, member)))