list_entry(ptr, type, member)
时间: 2023-07-31 09:09:04 浏览: 120
list_entry宏定义在Linux内核的include/linux/list.h头文件中,其作用是根据链表节点中的成员变量的地址,计算出整个结构体的地址。
宏定义如下:
```
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
```
其中,ptr是链表节点中成员变量的地址,type是结构体的类型,member是结构体中作为链表节点的成员变量名。
宏的实现依赖于container_of宏,其定义如下:
```
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
```
该宏通过offsetof宏计算出member成员在结构体中的偏移量,然后通过指针运算得到整个结构体的地址。
使用list_entry宏可以方便地遍历链表,并访问每个节点对应的结构体。假设有一个链表节点的成员变量名为node,对应的结构体类型为struct my_struct,使用list_entry宏遍历链表的代码如下:
```
struct my_struct *pos;
list_for_each_entry(pos, &list_head, node) {
// 访问pos指向的结构体
}
```
其中,list_head是链表头节点的指针变量。list_for_each_entry宏是一个遍历链表的宏,它会自动计算出每个节点对应的结构体的地址,并将其赋值给pos变量。在循环体中,可以通过pos指针访问结构体的成员变量。
阅读全文