-
-
[推荐]container_of 宏
-
发表于: 2009-6-24 14:56 5883
-
内核中的container_of宏
最近在学习c语言。不小心碰到了内核头文件中的一段宏,觉得非常精辟。拿来跟大家分享,同时也有点疑问,
请大家不吝指教哈!
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
container_of宏,用来根据结构体成员的地址,来获得结构体首地址。
ptr为结构体成员的地址,type为结构体变量类型,member为结构体成员。
第一个宏有个特别的地方是 typeof. 内核头文件中,并没有typeof这个宏,网上查资料,typeof 是在编译期间gcc自动支持的。
用来分析变量名的类型。
第二段宏(TYPE *)0也比较特别。理解是,(TYPE*)0的起始地址为0,而&((TYPE *)0)->MEMBER)的地址,也就是成员变量相对与首地址的偏移。
对这段宏,我有个不完全理解的地方是,
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
如果改为
#define container_of(ptr, type, member) ({ \
(type *)( (char *)ptr - offsetof(type,member) );})
我在测试过程中,是能正常工作的。而实际宏的编写,避免直接对ptr进行类型转换。我不明白为设么这样做。
最近在学习c语言。不小心碰到了内核头文件中的一段宏,觉得非常精辟。拿来跟大家分享,同时也有点疑问,
请大家不吝指教哈!
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
container_of宏,用来根据结构体成员的地址,来获得结构体首地址。
ptr为结构体成员的地址,type为结构体变量类型,member为结构体成员。
第一个宏有个特别的地方是 typeof. 内核头文件中,并没有typeof这个宏,网上查资料,typeof 是在编译期间gcc自动支持的。
用来分析变量名的类型。
第二段宏(TYPE *)0也比较特别。理解是,(TYPE*)0的起始地址为0,而&((TYPE *)0)->MEMBER)的地址,也就是成员变量相对与首地址的偏移。
对这段宏,我有个不完全理解的地方是,
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
如果改为
#define container_of(ptr, type, member) ({ \
(type *)( (char *)ptr - offsetof(type,member) );})
我在测试过程中,是能正常工作的。而实际宏的编写,避免直接对ptr进行类型转换。我不明白为设么这样做。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [求助]论坛老人求助--逆向半天学不会,有疑惑 4626
- [推荐]container_of 宏 5884
- [原创]学习缓冲区溢出的时候的一个小问题 2815
- [求助].net破解请教 4439
- [求助][求助]程序正常编译,但不能f5调试 4339
看原图
赞赏
雪币:
留言: