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内核学习

 

 

 

 

posted on 2012-04-16 20:03  feix760  阅读(898)  评论(0编辑  收藏  举报