EDA365电子论坛网
标题:
请问内核源码中的 containerof 怎样实现?
[打印本页]
作者:
domenica
时间:
2020-8-28 14:34
标题:
请问内核源码中的 containerof 怎样实现?
内核中源码是这样的
, g& }, @) }; X2 }8 L
6 n7 m. f3 T o. h
#define container_of(ptr, type, member) ({ \
3 ^0 h( h* U2 g
const 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