VS 2015宏观解释

时间:2017-03-28 13:45:28

标签: c++ windows visual-studio-2015

我们找到了这个宏

#define OFFSETOFCLASS(base, derived) \
    ((DWORD)(DWORD_PTR)(STATIC_CAST(base*)((derived*)8))-8)

在处理驻留在此处的某些Windows Kits标题时

c:\Program Files (x86)\Windows Kits\8.1\Include\um\Shlwapi.h

这个宏实际上做了什么?

1 个答案:

答案 0 :(得分:1)

此宏计算基本指针和派生指针之间的偏移量。

首先,它需要一个随机地址(8)并将其强制转换为derived*。基本上它说"让我们说一些随机Derived从内存地址8开始#34;

然后静态广播到base*。由于basederived的基类,因此生成的base*指针将会或不会指向内存中的同一点(8),具体取决于它{&#39}。布局。

然后它将结果转换为DWORD_PTR,然后转换为DWORD以从指针中生成一个数字。最后,它减去8(它使用的初始值)并获得偏移量。可以使用任何随机数代替8

例如,如果basederived都是空类,那么:

  • derived *将指向8
  • base *将指向8
  • 结果DWORD为8
  • 8-8 = 0,因此指针之间的偏移量为0.