我正在阅读Essential COM并在本书的第2章遇到了一个宏'BASE_OFFSET',我并不真正理解它的语法或为什么这样做.
#define BASE_OFFSET(ClassName, BaseName) \
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000)
Run Code Online (Sandbox Code Playgroud)
谁能解释这个宏以及我们如何使用它?事实上,这本书使用了这个宏,但由于我不太了解它,我没有看到它的实际用法.非常感谢你提前.
宏构成了一个虚拟的指针ClassName与reinterpret_cast,然后它投影到BaseName与static_cast.
在存在多重继承的情况下,基类子对象的地址并不总是与对象的地址相同.从原始虚拟地址中减去该可能不同的地址,以获得BaseName对象中子对象的偏移量ClassName.它类似于offsetof,但对于基类子对象而不是成员.

这只有在你做一些令人讨厌的低级别的东西时才有用.