解码偏移宏
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 type
的 member
成员位于空指针地址 .
或者换句话说,这是获取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
变量。
我试图理解 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 type
的 member
成员位于空指针地址 .
或者换句话说,这是获取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
变量。