在看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 *)类型。
测试代码如下: