首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“匿名结构”是标准吗?而且,真的,他们是什么?

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

Stack Overflow用户
提问于 2013-01-09 23:01:49
回答 2查看 38.9K关注 0票数 62

估计匿名结构在C++中是不标准的:

Microsoft扩展允许您在另一个结构中声明结构变量,而不给它命名。这些嵌套结构称为匿名结构。C++不允许匿名结构。 您可以访问匿名结构的成员,就像它们是包含结构中的成员一样。

同意

有人告诉我,这个特性不一定等同于创建一个未命名的结构,但我看不到标准措辞的区别。

C++11说:

[C++11: 9/1]:..类说明符,其类头省略类头名定义未命名的类.

并为缺少名称的类型定义提供一个完整的语法结构。

C++03缺乏这种明确的措辞,但类似地指出,类型定义中的identifier是可选的,并在9.4.2/53.5/4中引用“未命名的类”。

  • 那么,MSDN是错的吗?这些都是完全标准的吗?
  • 或者,在“未命名的结构/类”与作为成员时,是否存在一些微妙之处,使它们无法被这个C++03/C++11功能所覆盖?
  • 我是否遗漏了“未命名结构”和“匿名结构”之间的一些基本区别?在我看来就像同义词。
EN

回答 2

Stack Overflow用户

发布于 2013-01-09 23:07:17

微软称之为匿名结构的东西是不标准的。未命名的结构只是一个没有名称的普通结构。除非您还定义了该类型的对象,否则您无法使用该对象做太多事情:

代码语言:javascript
复制
struct {
    int i;
    double d;
} my_object;

my_object.d = 2.3;

匿名unions是该标准的一部分,它们的行为可以通过阅读匿名结构的微软的描述来实现:

代码语言:javascript
复制
union {
    int i;
    double d;
};

d = 2.3;
票数 14
EN

Stack Overflow用户

发布于 2013-01-09 23:09:41

关于匿名工会的标准讨论: 9.5/5

形式的结合 联合{成员-规格}; 称为匿名联合;它定义未命名类型的未命名对象。匿名联盟的成员规范只应定义非静态数据成员。注意:嵌套类型和函数不能在匿名联合中声明。-end注意:匿名工会成员的姓名应与宣布匿名工会的范围内的任何其他实体的名称不同。为了查找名称,在匿名联合定义之后,匿名联合的成员被视为已在声明匿名联合的范围内定义。示例: { union { int a;const char* p;};a= 1;p= "Jennifer";} 在这里,a和p像普通(非成员)变量一样使用,但是由于它们是联合成员,所以它们具有相同的地址。-end实例

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

据我所知,标准中没有针对未命名结构的此类行为。请注意,在所引用的示例中,您可以实现其他不可能实现的任务,比如为堆栈中的变量共享存储,而匿名结构则不会给表带来任何新的东西。

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

https://stackoverflow.com/questions/14248044

复制
相关文章

相似问题

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