c ++ - VS 2015 Macro Forklaring

Indlæg af Hanne Mølgaard Plasc

Problem



Vi fandt denne makro


#define OFFSETOFCLASS(base, derived) 
    ((DWORD)(DWORD\_PTR)(STATIC\_CAST(base*)((derived*)8))-8)


mens du arbejder på nogle Windows Kits-overskrifter, der ligger her


c:Program Files (x86)Windows Kits8.1IncludeumShlwapi.h


Hvad gør denne makro faktisk?

Bedste reference


Denne makro beregner forskydning mellem basen og afledte pointers.


Først tager det en tilfældig adresse (8) og kaster den til derived*. Dybest set siger det 'lad os sige, at nogle tilfældige Afledte starter ved hukommelsesadresse 8'.


Så static\_casts det til base*. Siden base er grundklassen for derived, vil den resulterende base* pointer vise eller vil ikke pege på samme punkt i hukommelsen (8), afhængigt af dets layout .


Derefter kaster resultatet til DWORD\_PTR og derefter til DWORD for at lave et nummer ud af markøren. Endelig trækker det 8 (den indledende værdi den bruges) og får forskydningen. Ethvert tilfældigt tal kan bruges i stedet for 8.


For eksempel hvis både base og derived er tomme klasser, så:



  • afledt * vil pege på 8

  • base * vil pege på 8

  • Resultatet DWORD bliver 8

  • 8-8=0, så forskydningen mellem pointerne er 0.