gpt4 book ai didi

c - Linux 中的列表条目

转载 作者:IT王子 更新时间:2023-10-29 00:14:11 24 4
gpt4 key购买 nike

user/include/linux/list.h

这个声明:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))

谁能解释一下这是什么以及它是如何工作的,在此先感谢

附:请尽可能简化您的回答,我了解 Linux 中的线程和进程,现在我正在探索各种可能性,但我有点受困于此。

最佳答案

考虑两个这样的结构:

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 数据的 struct container 值的指针 值,由 ptr 指向:

struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);

宏的工作原理是计算 struct containerdata_item 的偏移量,并从 data_ptr 指针中减去那么多字节。这在转换为 struct container * 时,提供了一个指向 struct container 的有效指针,该struct container “内部”保存了这个特定的 struct data

宏也可以通过使用内置的 offsetof() 宏来稍微简化:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – offsetof(type, member)))

关于c - Linux 中的列表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com