list.h经典宏
list_entry(ptr, type, member)
基本等价于:
#define list_entry(ptr,type,member) \ ((type*)((char *)(ptr)-(unsigned long)(&((type*)0)->member)))
根据结构体list的member字段的指针得到此结构体的指针
将宏名改成struct_entry:
#define struct_entry(ptr,type,member) \ ((type*)((char *)(ptr)-(unsigned long)(&((type*)0)->member)))
便是一通用型宏:根据一结构体(或type)某个字段的指针得到此结构体(或type)的指针
list_for_each(pos, head):
#define list_for_each(pos, head) \ for (pos = (head)->next; prefetch(pos->next), pos != (head); \ pos = pos->next)
prefetch(const void *x),最终由汇编实现,用来预处理加载pos->next节点,可以不考虑
应用举例:
struct list_head list_h; struct list_head list_t; list_h.next=list_h.prev=&list_t; list_t.next=list_t.prev=&list_h; //构造一个含一个节点的 struct list_head list_h struct list_head * tmp; list_for_each(tmp,&list_h){ //遍历语句,tmp 指向当前遍历到了的节点 printf("%d",(int)tmp->next); }
虽然此宏简单,但遍历时结合list_entry(ptr, type, member) 将是方便实用的
----linux内核学习