“匿名结构”是标准吗? 而且,真的,他们是什么?

MSDN 认为匿名结构在C ++中是非标准的:

Microsoft C扩展允许您在另一个结构中声明一个结构variables,而不必为其命名。 这些嵌套结构被称为匿名结构。 C ++不允许匿名结构。

您可以像访问包含结构中的成员一样访问匿名结构的成员。

@ K-ballo同意 。

我被告知,这个function不一定是创build一个未命名的结构相同,但我看不出标准措辞的区别。

C ++ 11说:

[C++11: 9/1][..]一个class-specifier,它的class-head省略了class-head-name,定义了一个未命名的类。

并为缺less名称的types定义提供了完整的语法结构。

C ++ 03缺less这种明确的措辞,但同样表明types定义中的identifier是可选的,并且引用9.4.2/53.5/4 “未命名类”。

  • 那么MSDN是错的,而这些东西都是完全标准的?
  • 或者在“未命名的结构体/类”之间缺less一些微妙的东西,当它们被用作阻止它们被这个C ++ 03 / C ++ 11function所覆盖的成员时,它们是相同的?
  • 我是否缺less“未命名结构”和“匿名结构”之间的一些根本区别? 他们看起来像我的同义词。

所有的标准文本都是指创build一个“无名结构”:

 struct { int hi; int bye; }; 

只是一个很好的友好types,没有可访问的名称。

以标准的方式,它可以被实例化为这样的成员:

 struct Foo { struct { int hi; int bye; } bar; }; int main() { Foo f; f.bar.hi = 3; } 

但是一个“匿名结构”是微妙的不同的 – 它是一个“无名结构”的组合,以及你神奇地从父对象中获取成员的事实:

 struct Foo { struct { int hi; int bye; }; // <--- no member name! }; int main() { Foo f; f.hi = 3; } 

与直觉相反 ,这不仅仅是创build一个在Foo嵌套的未命名的结构体,而且还会自动给你一个“匿名成员”,使成员可以在父对象中进行访问。

这是非标准的function。 GCC 支持它 ,Visual C ++ 支持它 。 Windows API头默认使用此function,但是您可以在包含Windows头文件之前通过添加#define NONAMELESSUNION来指定您不需要此function。

与“匿名联合”的标准function相比,它们做了类似的事情:

 struct Foo { union { int hi; int bye; }; // <--- no member name! }; int main() { Foo f; f.hi = 3; } 

看起来,尽pipe术语“未命名”是指types(即“类”或“结构”)本身,但术语“匿名”指的是实际实例化的成员(使用旧的含义“结构“这更接近”某个structtypes的对象“)。 这可能是你最初的困惑的根源。

微软称匿名结构的东西不是标准的。 未命名的结构只是一个没有名字的普通结构。 除非你也定义了一个这样的对象,

 struct { int i; double d; } my_object; my_object.d = 2.3; 

匿名工会是标准的一部分,他们有你从阅读微软的匿名结构描述期望的行为:

 union { int i; double d; }; d = 2.3; 

标准谈到匿名工会 :[9.5] / 5

表单的联合

 union { member-specification } ; 

被称为匿名联盟; 它定义了一个未命名types的未命名对象。 匿名联合的成员规范只能定义非静态数据成员。 [注:嵌套types和函数不能在匿名联合中声明。 – 注意]匿名工会成员的姓名应与匿名工会申报范围内的任何其他实体的姓名不同。 为了名称查找的目的,在匿名联合定义之后,匿名联合的成员被认为是在声明匿名联合的范围内定义的。 [例如:

 void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; } 

这里的a和p和普通(非成员)variables一样,但由于它们是工会成员,所以他们有相同的地址。 – 例子]

微软谈到的匿名结构unions这个特性,但是被应用于structs 。 不仅仅是一个未命名的定义,重要的是要注意,匿名联合/结构的mebers被认为是在声明了匿名联合/结构的范围内定义的。

据我所知,标准中的无名结构没有这种行为。 请注意,在引用的例子中,您可以实现其他方式无法实现的function,例如共享堆栈中的variables存储,而匿名结构则不会为表格带来新的效果。