你如何在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 ,其值是以字节为单位的偏移量,从结构的开头(由类型指定)到结构成员(由mem​​ber-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的回答判断,这实际上应该有效。