红联Linux门户
Linux帮助

container_of宏中为什么需要中间变量__mptr?

发布时间:2014-12-24 17:06:09来源:红联作者:qweeah
先贴上源码[code]#define container_of(ptr, type, member) ({ \
359 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
360 (type *)( (char *)__mptr - offsetof(type,member) );})
361
[/code]为什么不能直接使用ptr,一定要用一个__mptr呢?

自己写了一个直接用ptr的,运行也是正常的,代码如下
请大牛点拨![code]#include
typedef int type_t;
#define CONTAINER_OF(ptr,type,member) ({ \
(type *) ((ptr) - GET_OFFSET(type,member) ); \
})
#define GET_OFFSET(type,member) ({ \
(type_t) &((type *)0)->member; \
})
struct numbers{
int num1;
double num2;
};

void main(void){
struct numbers n1,n2;
struct numbers *n_ptr;
int *ptr;
n1.num1=1;
n1.num2=0.1;
ptr=&n1.num1;
n_ptr=CONTAINER_OF(ptr,struct numbers,num1);
printf("%lf\n",n_ptr->num2);

n2.num1=2;
n2.num2=0.2;
ptr=&n2.num1;
n_ptr=CONTAINER_OF(ptr,struct numbers,num1);
printf("%lf\n",n_ptr->num2);
}[/code]
文章评论

共有 1 条评论

  1. carming 于 2015-02-03 11:15:10发表:

    为了在编译期间进行类型检测,保证传入的成员地址与成员类型是匹配的,而在运行期间则和忽略中间变量mptr的效果一样。