在看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 *)類型。
測試代碼如下: