以下宏做了什么?

时间:2010-08-10 20:19:17

标签: c qemu

在qemu源代码中,我有以下名为offsetof的宏。任何人都能告诉我它的作用吗?

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

以这种方式使用:

offsetof(CPUState, icount_decr.u32)

其中CPUState是一个结构。

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

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

3 个答案:

答案 0 :(得分:3)

它获取结构成员的偏移量。它通过将地址零转换为该类型的结构然后获取成员的地址来实现。

答案 1 :(得分:1)

你的想法是正确的!并且宏的名称也给出了很好的暗示。 ;)

答案 2 :(得分:0)

在§7.17/ 3中定义:

  

offsetof(type, member-designator)
  它扩展为一个整数常量表达式,其类型为size_t,值为   这是结构成员的偏移量(以字节为单位)(由 member-designator 指定),   从其结构的开头(由 type 指定)。类型和成员指示符   应如此给予   static type t;
  然后表达式&(t.member-designator)求值为地址常量。 (如果   指定的成员是位字段,行为未定义。)

因为图书馆不一定必须遵循语言规则,所以实现可以免费获得结果,但它很高兴。

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

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