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

Have anonymous structs and unions in C11 been incorrectly described?

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

6.7.2.1 p13. An unnamed member whose type specifier is a structure specifier with no tag is called an anonymous structure; an unnamed member whose type specifier is a union specifier with no tag is called an anonymous union. The members of an anonymous structure or union are considered to be members of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.

注意强调:匿名 struct/union 的成员不在包含 struct/union 的 范围 中,而是完全 成员。但是有附加的责任:

6.7.2.1 p16. The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit-field, then to the unit in which it resides), and vice versa.

总而言之,这些似乎暗示(命名)联合内的匿名结构的成员表现得像共同定位的、互斥的联合成员。所以以下应该有效:

union Foo
{
    struct
    {
        char a;
        char b;
    };
};

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

当然,它不会,我们也不希望它...如果它们像上面那样工作,就没有理由匿名 structs/unions。尽管如此,标准在这一点上似乎毫不含糊。有什么我想念的吗?

TL;DR

这看起来像是一个措辞问题,它们不应重叠。

详情

这包含在 Defect Report (DR) 499 中,它要求:

Given the following code:

union U {   
 struct {
   char B1;
   char B2;
   char B3;
   char B4;  
 };  
int word; 
} u;

Does the storage of B1, B2, B3 and B4 overlap?

According to 6.7.2.1#13, the members should overlap in storage as they become members of 'union U'.
At least one implementation (GCC) seems to NOT consider them to be overlapping.
At least one implementation (IBM's XL LE AIX) considers them to be overlapping as the standard currently states.

委员会的回应是:

The storage does not overlap.

A related issue is to be found in DR 502 and both may be resolved with coordinated wording changes.

和(强调)

Change §6.7.2.1 p13 from:

An unnamed member of structure type with no tag is called an anonymous structure; an unnamed member of union type with no tag is called an anonymous union. The members of an anonymous structure or union are considered to be members of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.

至:

An unnamed member of structure type with no tag is called an anonymous structure; an unnamed member of union type with no tag is called an anonymous union. The names of members of an anonymous structure or union are added to the name space of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.

将充分解决问题。