lik*_*eIT 26 c linux linux-kernel
user/include/linux/list.h
Run Code Online (Sandbox Code Playgroud)
本声明:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))
Run Code Online (Sandbox Code Playgroud)
有人可以解释这是什么以及它是如何工作的,提前谢谢
PS请尽可能地简化你的答案,我知道Linux中的线程,进程,现在我正在探索可能性,而且我有点困惑于这个.
Pet*_*nen 29
考虑两个这样的结构:
struct data {
int something;
};
struct container {
int something_before;
struct data data_item;
int something_after;
};
Run Code Online (Sandbox Code Playgroud)
假设您有一个指向struct data值的指针:
struct data *data_ptr;
Run Code Online (Sandbox Code Playgroud)
该list_entry()宏可以帮助您转换data_ptr为指向struct container保存struct data值的值的指针,指向ptr:
struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);
Run Code Online (Sandbox Code Playgroud)
宏通过计算data_item内部的偏移量struct container,并从data_ptr指针中减去那么多字节来工作.这个,当转换为struct container *,给出一个有效的指针struct container,持有这个特定的struct data"内部".
使用内置offsetof()宏也可以简化宏:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – offsetof(type, member)))
Run Code Online (Sandbox Code Playgroud)