在qemu源代码中,我有以下名为offsetof
的宏。任何人都能告诉我它的作用吗?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
以这种方式使用:
offsetof(CPUState, icount_decr.u32)
其中CPUState是一个结构。
我认为它给出了结构中成员的偏移量,但我不确定。
编辑:是的,我发现了发生了什么。 CPUState的定义里面有一个宏,我错过了,其中包括变量icount_decr。答案 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
,那么它们会使您的程序行为未定义,而应该使用标准库。 (假人。)