#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;
}