2011-12-10 57 views
5

我正在閱讀基本的COM,並且遇到了本書第2章中的一個宏'BASE_OFFSET',我並不真正瞭解它的語法或爲什麼這樣做。BASE_OFFSET來自Essential COM的宏

#define BASE_OFFSET(ClassName, BaseName) \ 
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000) 

任何人都可以解釋這個宏以及我們如何使用它?實際上,這本書使用了這個宏,但由於我不太瞭解它,所以我沒有看到它的實際用法。非常感謝你提前。

+0

謝謝你編輯我的問題。 – istudy0

+1

順便說一句,另一個標準的Windows宏[FIELD_OFFSET](http://msdn.microsoft.com/en-us/library/windows/hardware/ff545727(v = vs.85).aspx)可以抵消命名字段的結構。 – Oleg

+0

感謝您的評論。 – istudy0

回答

7

該宏組成一個指向ClassNamereinterpret_cast的虛擬指針,然後使用static_cast將其轉換爲BaseName

在存在多繼承的情況下,基類子對象的地址並不總是與對象的地址相同。從原始虛擬地址中減去此可能不同的地址,以獲得ClassName對象中BaseName子對象的偏移量。它與offsetof類似,但對於基類子對象而不是成員。

Diagram showing an example

此,如果你正在做一些討厭的低層次的東西纔有用。

+0

非常感謝您的解釋。你的圖幫助我想象發生了什麼。 – istudy0

+0

+1,這裏也有類似的東西:http://stackoverflow.com/q/5014061/57428 – sharptooth