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 *)类型。

测试代码如下:
CONTAINING_RECORD宏的使用_第1张图片

你可能感兴趣的:(c++,windows核心编程)