#define container_of(ptr, type, member)

昨天看ttm的时候看到一个内核中的经典用法:

struct ttm_agp_backend {
	struct ttm_tt ttm;
	struct agp_memory *mem;
	struct agp_bridge_data *bridge;
};

static int ttm_agp_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
{
	struct ttm_agp_backend *agp_be = container_of(ttm, struct ttm_agp_backend, ttm);
    ...
}

原型:

#define container_of(ptr, type, member) ({              \
    void *__mptr = (void *)(ptr);                   \
    BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
             !__same_type(*(ptr), void),            \
             "pointer type mismatch in container_of()");    \
    ((type *)(__mptr - offsetof(type, member))); })

复合语句函数化

typeof(member)* container_of(ptr, type, member) {
    void *__mptr = (void *)(ptr); 
    BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&!__same_type(*(ptr), void), "pointer type mismatch in container_of()");
    return (type *)(__mptr - offsetof(type, member)); 
}

参数介绍:

  • ptr:一个结构体中的指针。
  • type:ptr所在结构体的类型。
  • member:ptr

函数解析:

  • void *__mptr = (void *)(ptr);

将prt的首地址给__mptr。

  • BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&!__same_type(*(ptr), void), "pointer type mismatch in container_of()");

判断ptr是否为type结构体中的成员。

  • offsetof(type, member);

//获取member在它所在结构体中的地址偏移量x。

  • (type *)(__mptr - offsetof(type, member));

__mptr的地址减去地址偏移量x即可得出ptr所在结构体变量的首地址。并强制转换该首地址成type类型的指针。

结论

    container_of(ptr, type, member)在ptr和member为同一个指针的情况下,可以用来找出ptr所在结构体变量的首地址。


参考:https://blog.csdn.net/s2603898260/article/details/79371024

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值