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]
carming 于 2015-02-03 11:15:10发表:
为了在编译期间进行类型检测,保证传入的成员地址与成员类型是匹配的,而在运行期间则和忽略中间变量mptr的效果一样。