一个没有标签名称的结构体嵌套在另一个结构体中有什么意义?

5
我刚刚遇到了一段代码片段,如下所示:
struct a {
    int mem1;
    char mem2;

    struct {
        int inner_mem1;
        int inner_mem2;
    };
};

我发现代码片段直接使用外部结构体变量名来访问内部结构体成员!!!例如:

struct a *avar;
....
avar->inner_mem1

这合法吗?虽然代码正在编译并正常工作,但是这样使用的目的是什么?有具体的应用场景吗?

请告诉我您的想法。


为什么它们有用:https://dev59.com/sGox5IYBdhLWcg3w1X2- - Ciro Santilli OurBigBook.com
1个回答

7
这被称为“匿名结构体”:
未命名的结构类型成员没有标签,被称为匿名结构;未命名的联合类型成员没有标签,被称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含结构或联合也是匿名的,则递归应用此规则。
这不是当前C标准C99的一部分,但预计将成为即将推出的标准的一部分(如上所述)。此外,许多编译器已经支持此功能作为扩展。

1
你引用的是什么?它似乎不是C标准。 - Lundin
1
@Lundin,我是在引用下一个标准的草案。我已经在我的回答中添加了一条注释。 - Jens Gustedt
这个引用来自于 C1X 草案。http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1516.pdf 一些编译器已经支持了这个特性。顺便提一下,这个特性来自于 Plan 9 C 编译器。 - nos
据我所知,根据当前的C99标准,未命名成员被视为未定义行为(6.7.2.1 §7)。我对标准的这一部分有正确的解释吗? - Lundin
@Lundin,不,我不这么认为。我阅读到的是只有在没有成员被命名时才会发生UB。 - Jens Gustedt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接