以下宏做什么?

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

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

它以这种方式使用:

 offsetof(CPUState, icount_decr.u32) 

其中CPUState是一个结构。

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

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

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

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

它在§7.17/ 3中定义:

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

因为库不一定遵循语言规则,所以实现可以自由地获得结果,但它很高兴。

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

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