首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C11中的匿名结构和联合是否被错误地描述了?

C11中的匿名结构和联合是否被错误地描述了?
EN

Stack Overflow用户
提问于 2018-04-04 17:30:50
回答 1查看 918关注 0票数 19

关于匿名结构和联盟的C标准:

6.7.2.1 p13.是一个未命名的成员,其类型说明符是没有标记的结构说明符,称为匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被认为是包含结构或联合的成员。如果包含的结构或联合也是匿名的,则可以递归地应用。

注意:与匿名结构/联合的成员不在包含的结构/联合的范围内不同,他们完全是结构/联合的成员。但这方面也有责任:

一个工会的规模足以容纳其最大的成员。最多可以在任何时候将其中一个成员的值存储在联合对象中。一个指向一个联合对象的指针,经过适当的转换,指向它的每个成员(或者如果一个成员是位字段,那么指向它所在的单元),反之亦然。

综合起来,这似乎意味着一个匿名结构的成员在一个(命名的)联盟中的行为就像一个位于同一地点的、相互排斥的工会成员。因此,以下几点应能奏效:

代码语言:javascript
复制
union Foo
{
    struct
    {
        char a;
        char b;
    };
};

int main(void) {
    union Foo f;
    assert(&f == &(f.a) && &f == &(f.b));
}

当然,没有,我们也不希望它.如果匿名结构/工会像上面那样工作,就没有理由了。然而,在这一点上,标准似乎是明确的。我遗漏了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-05 20:27:25

TL;DR

这似乎是一个措辞问题,不应重叠。

详细信息

这是在缺陷报告(DR) 499中讨论的,它要求:

考虑到以下代码: 联合U{ struct { char B1;char B2;char B3;char B4;};int word;} u; B1、B2、B3和B4的存储是否重叠? 根据6.7.2.1#13的说法,当成员成为联盟U的成员时,他们应该在存储中重叠。 至少有一个项目(GCC)似乎不认为它们是重叠的。 至少有一个实现(IBM的XL )认为它们是重叠的,因为标准当前状态是这样的。

委员会的答复是:

存储空间不重叠。在502博士中可以找到一个相关的问题,这两个问题都可以通过协调一致的措辞修改来解决。

和(重点增加)

修改§6.7.2.1 p13: 没有标记的结构类型的未命名成员称为匿名结构;没有标记的未命名的联合类型成员称为匿名联合。匿名结构或联合的成员被认为是包含的结构或联合的成员。如果包含的结构或联合也是匿名的,则这将递归地应用。至: 没有标记的结构类型的未命名成员称为匿名结构;没有标记的未命名的联合类型成员称为匿名联合。匿名结构或联合的成员的名称被添加到、包含的结构或联合的名称空间中。如果包含的结构或联合也是匿名的,则这将递归地应用。就能充分解决这个问题。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49657053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档