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

作者: qweeah 2014-12-24 17:06:09
先贴上源码[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]

相关资讯