以下宏做什么?
在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
,它们会使您的程序行为未定义,而应该使用标准库。 (假人。)