找回密码
 注册
关于网站域名变更的通知
查看: 240|回复: 2
打印 上一主题 下一主题

请问内核源码中的 containerof 怎样实现?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-8-28 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
内核中源码是这样的
& t/ w' T% A$ \& E3 T/ h5 y( `! @7 s
#define container_of(ptr, type, member) ({     \                / @* C/ l4 |2 U$ T2 D' N: Q
const typeof( ((type *)0)->member ) *__mptr = (ptr);   \
6 T5 C2 S8 N7 D2 j% q5 Z(type *)( (char *)__mptr - offsetof(type,member) ); \" m: `* W; l7 C$ Y5 W
})5 a4 Y2 d5 t* z2 Q7 C9 `

4 H: i3 U! j! [1 _+ \
4 {5 k2 `3 {9 n9 X8 J. U0 _: I为什么要用typeof获取成员类型?直接写成这样不可以吗?4 [9 m, r( N- _% x

1 J% E1 N, h  Y- ?' Q#define container_of(ptr, type, member) ({     \                  K/ P& k6 v4 k6 f+ v
(type *)( (char *)ptr - offsetof(type,member) ); \% V* [. s4 q' w% M, g
})* \( E; W+ }) G/ t. T

+ D- p+ K6 o( c1 K( s* x
4 Q+ S1 l, T$ k, r4 ]+ L' p: Z* j内核中写法有什么好处吗?

该用户从未签到

3#
发表于 2020-8-28 15:58 | 只看该作者
猜测是为了安全检查,typeof这里的目的是让编译器对ptr做一次类型转换,如果传进来的ptr不是member指针类型,这里compile就会发现问题。假如不做这次类型转换,ptr也不是一个member类型的指针,第二句(char *)ptr不管三七二十一开始算type *,出来的地址不是NULL,但是肯定不是正确的地址,后面的程序全跑飞了。运行时的问题比编译时的问题,debug的难度可不是一个数量级。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 00:55 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表