CONTAINING_RECORD宏的使用

在看IOCP模型中看到一個CONTAINING_RECORD宏,用於根據一個結構體的一個成員獲取這個結構體的首地址。
宏定義如下 

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                                  (PCHAR)(address) - \
                                                  (ULONG_PTR)(&((type *)0)->field)))

簡單分析下:

首先,由於用type*來對0進行強制類型轉換(type是一個結構體名或類名)再調用其成員後,該成員的地址就等於其相對於基地址的相對地址即偏移。所以 (&((type *)0)->field) 就是偏移量,而(PCHAR)(address)是成員地址,二者相減後就得到了首地址,最後再強制轉換爲 (type *)類型。

測試代碼如下:

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