Linux 2.4.22
在这一版本中的 list_entry的宏定义实现如下:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
乍一看,会觉得特别复杂,其实分析之后,会发现清晰明了:
实现背景:
linux 中 list 为了实现类似 c++ list模板的效果,即一个list可以适用于各种不同的struct。便采用类似下图的设计,使list 相当于一个绳索,可以挂载各种 struct。通过当前 list_head可以得到所挂载的struct指针,便实现了类似于模板效果。
如下实例
typedef struct page {
struct list_head list;

文章详细解析了Linux2.4.22版本中list_entry宏的实现,该宏用于从list_head结构获取关联的struct指针。早期实现通过计算成员相对于结构体的偏移量来完成,而在新的C语言规范中,使用__builtin_offsetof函数来安全地计算偏移。这个过程保证了list可以灵活应用于不同类型的struct,实现类似C++模板的效果。
756

被折叠的 条评论
为什么被折叠?



