当前位置: 技术问答>linux和unix
container_of() 的实现代码为什么这么写
来源: 互联网 发布时间:2016-12-21
本文导语: 看到下面的定义,有点不明白。 为什么不直接这么定义呢? #define container_of(ptr, type, member) ({ (type *)( (char *)(ptr) - offsetof(type,member) );}) ------ Linux Source Code ------ /** * container_of - cast a member of a stru...
看到下面的定义,有点不明白。
为什么不直接这么定义呢?
#define container_of(ptr, type, member) ({
(type *)( (char *)(ptr) - offsetof(type,member) );})
------ Linux Source Code ------
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#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) );})
------ Linux Source Code ------
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
|
我想,这可能是为了对ptr的类型进行编译器检查,
如果ptr不小心用错了,不是member这个名字的类型,编译器就会有反应。
从逻辑上这一句确实没作用,但是内核中比较常用这种技巧。
|
ptr是不是member类型,type中是不是包涵member,type的类型,都一并检查了
|
确实是的
|
知道一个结构体成员的地址怎么去找结构体的地址
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。