EDA365电子论坛网

标题: 请问内核源码中的 containerof 怎样实现? [打印本页]

作者: domenica    时间: 2020-8-28 14:34
标题: 请问内核源码中的 containerof 怎样实现?
内核中源码是这样的
, g& }, @) }; X2 }8 L6 n7 m. f3 T  o. h
#define container_of(ptr, type, member) ({     \               
3 ^0 h( h* U2 gconst typeof( ((type *)0)->member ) *__mptr = (ptr);   \' _+ n: L, i4 k5 ~- L& w* G' E
(type *)( (char *)__mptr - offsetof(type,member) ); \: \  t& d8 b8 a5 [
})
& m& t, l1 y3 x! O( ~4 [* @9 ~
- n6 c% N5 R/ k  a. P& G* G- l, j+ z8 D- H! `& @& r2 r
为什么要用typeof获取成员类型?直接写成这样不可以吗?( t, w8 w8 E2 A7 e9 ~

1 W: I$ X1 G0 m( T8 J#define container_of(ptr, type, member) ({     \                + O+ v% _9 C& L& B
(type *)( (char *)ptr - offsetof(type,member) ); \. ?  M) K" |% v  S- s
})
  D1 C2 u! d6 L! \
7 i: i* F& |7 O- S& V2 e8 U. J4 [& K: ~5 J/ D; j, O
内核中写法有什么好处吗?
作者: younicp    时间: 2020-8-28 15:58
帮顶
作者: thinkfunny    时间: 2020-8-28 15:58
猜测是为了安全检查,typeof这里的目的是让编译器对ptr做一次类型转换,如果传进来的ptr不是member指针类型,这里compile就会发现问题。假如不做这次类型转换,ptr也不是一个member类型的指针,第二句(char *)ptr不管三七二十一开始算type *,出来的地址不是NULL,但是肯定不是正确的地址,后面的程序全跑飞了。运行时的问题比编译时的问题,debug的难度可不是一个数量级。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2