#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(UINT_PTR)(&((type *)0)->field)))
也就是:
#define CONTAINING_RECORD(address, type, field) \
((type *) ( (PCHAR)(address) - (UINT_PTR)(&((type *)0)->field)))
按我的理解
该宏用于,知道某个结构中某个数据成员的地址(PCHAR)(address)
然后在该地址的基础上减去该结构到上面的某个数据成员内存地址的偏移量(列如Ox0004 地址到 Ox0008地址,偏移量就是4),就得到了该结构的地址. 偏移量(UINT_PTR)(&((type *)0)->field)
列如
typedef struct _TEST
{
int a;
int b;
}TEST,*PTEST;
int main()
{
TEST *p1;
TEST *p2;
TEST *p3;
p1=new TEST;
p1->a=10;
p1->b=20;
p2=CONTAINING_RECORD(&p1->b,TEST,b);
cout<<p2->a<<endl;
cout<<p2->b<<endl;
p2->a=100;
p2->b=1000;
p3=CONTAINING_RECORD(&p1->a,TEST,a);
cout<<p3->a<<endl;
cout<<p3->b<<endl; //p2,p3,p1都指向同一个地址
return 0;
}