0

在 qemu 源代码中,我有以下名为offsetof. 谁能告诉我它是做什么的?

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)

它以这种方式使用:

offsetof(CPUState, icount_decr.u32)

其中 CPUState 是一个结构。

我认为它给出了结构内成员的偏移量,但我不确定。

编辑:是的,我发现了发生了什么。CPUState 的定义里面有一个宏,我错过了,其中包括变量 icount_decr。

4

3 回答 3

3

它获取结构成员的偏移量。它通过将地址零转换为该类型的结构然后获取成员的地址来做到这一点。

于 2010-08-10T20:22:35.437 回答
1

你的想法是对的!宏的名称也给出了很好的提示。;)

于 2010-08-10T20:20:45.687 回答
0

它在 §7.17/3 中定义:

offsetof(type, member-designator)
它扩展为具有 type 的整数常量表达式size_t,其值是以字节为单位的偏移量,从其结构的开头(由type指定)到结构成员(由member-designator 指定)。类型和成员指示符应使得给定 然后表达式计算为地址常量。(如果指定的成员是位域,则行为未定义。)
static type t;
&(t.member-designator)

因为库不一定要遵循语言规则,所以实现可以随意获得结果。

所以这个特定实现的结果不是未定义的行为,因为你不应该关心它是如何实现的。(换句话说,您的实现保证通过空指针获取间接地址是明确定义的。您当然不能在自己的程序中假设这一点。)

如果某个库已(重新)定义offsetof,则它们使您的程序行为未定义,应该改用标准库。(假人。)

于 2010-08-10T20:27:36.207 回答