你如何在struct上使用offsetof()?
我想要offsetof() mystruct1
的参数行。 我试过了
offsetof(struct mystruct1, rec.structPtr1.u_line.line)
并且
offsetof(struct mystruct1, line)
但都不起作用。
union { struct mystruct1 structPtr1; struct mystruct2 structPtr2; } rec; typedef struct mystruct1 { union { struct { short len; char buf[2]; } line; struct { short len; } logo; } u_line; };
offsetof()
宏有两个参数。 C99标准说(在§7.17
):
offsetof(type, member-designator)
它扩展为一个整数常量表达式,其类型为
size_t
,其值是以字节为单位的偏移量,从结构的开头(由类型指定)到结构成员(由member-designator指定)。 类型和成员指示符应为给定的static type t;
然后表达式
&(t.member-designator)
求值为地址常量。
所以,你需要写:
offsetof(struct mystruct1, u_line.line);
但是,我们可以观察到答案将为零,因为mystruct1
包含一个union
作为第一个成员(并且只有),并且它的line
部分是union的一个元素,所以它将在偏移0处。
阅读这篇文章的好文章是:
使用offsetof()宏学习一个新技巧
我在嵌入式代码中经常使用offsetof宏,以及文章中讨论的修改后的SIZEOF宏。
你的struct mystruct1
有1个名为u_line
成员。 您可以看到该成员的偏移量
offsetof(struct mystruct1, u_line); // should be 0
如果你指定每个“父母的水平”,或者成员
offsetof(struct mystruct1, u_line.line); offsetof(struct mystruct1, u_line.line.buf); offsetof(struct mystruct1, u_line.logo);
首先,AFAIK, offsetof
仅用于结构的直接成员(我是否正确?)。
其次,了解流行的offsetof
实现的内部细节,我可以建议尝试
offsetof(struct mystruct1, u_line.line)
这应该工作。 它是否符合标准对我来说是一个悬而未决的问题。
PS根据@Jonathan Leffler的回答判断,这实际上应该有效。