解码偏移宏

decoding the offset macro

我试图理解 c 中的偏移宏,但在尝试解释它时遇到了问题

&((type *)0)

#define offsetof(type, member) ((size_t) &((type *)0)->member)

如何阅读。我了解功能,但不了解该术语的确切解释。

谢谢

这个预处理器宏的扩展:

#define offsetof(type, member) ((size_t) &((type *)0)->member)

导致以下正式定义:The offsetof a given member on a given type is the casting to size_t of the address typemember 成员位于空指针地址 .

或者换句话说,这是获取member地址的黑魔法,就好像在空指针地址存在type的对象一样(注意:只要不崩溃就不会崩溃)此处不发生读取或写入)。由于这样一个成员的地址现在是绝对的(相对于零),它的值可以安全地转换为 size_t,从而有效地评估这样一个 member 的偏移量作为一个绝对值。

希望对您有所帮助!

看看这段代码:

type *x = 0;
size_t y = &x->member;

通常,y 等于 x+offset,但因为 x=0,我们只得到偏移量。

在代码中我们写 ((type *)0) - 直接返回指向类型 type 的指针,而不创建 x 变量,然后我们获取成员 ((type *)0)->member) 的地址。所有这些都定义为 size_t 变量。