CONTAINING_RECORD macro之研究

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章