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

 

 

 

 

转载于:https://www.cnblogs.com/feix760/archive/2012/04/16/2452566.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值