为什么 C 不允许匿名结构?

新手上路,请多包涵

一些 C++ 编译器允许匿名联合和结构作为标准 C++ 的扩展。这是一些语法糖,偶尔会很有帮助。

阻止它成为标准一部分的理由是什么?有技术障碍吗?一个哲学的?或者只是不足以证明它的合理性?

这是我正在谈论的示例:

 struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

我的编译器会接受这一点,但它警告说 “无名结构/联合”是 C++ 的非标准扩展

原文由 Adrian McCarthy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 956
2 个回答

正如其他人指出的那样,标准 C++ 中允许使用匿名联合,但不允许使用匿名结构。

原因是 C 支持匿名联合但不支持匿名结构*,因此 C++ 支持前者是为了兼容,但不支持后者,因为它不需要兼容性。

此外,在 C++ 中匿名结构并没有多大用处。 The use you demonstrate, to have a struct containing three floats which can be referred to either by .v[i] , or .x , .y , and .z ,我相信会导致 C++ 中的未定义行为。 C++ 不允许您写入联合的一个成员,例如 .v[1] ,然后从另一个成员读取,例如 .y 。尽管这样做的代码并不少见,但实际上并没有很好地定义。

C++ 的用户定义类型工具提供了替代解决方案。例如:

 struct vector3 {
  float v[3];
  float &operator[] (int i) { return v[i]; }
  float &x() { return v[0]; }
  float &y() { return v[1]; }
  float &z() { return v[2]; }
};

\* C11 显然添加了匿名结构,因此未来对 C++ 的修订可能会添加它们。

原文由 bames53 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据编辑、评论和这篇 MSDN 文章: 匿名结构,我会冒险猜测 - 它与封装的概念不符。除了添加一个成员之外,我不希望一个类的成员会弄乱我的类命名空间。此外,对匿名结构的更改可能会在未经许可的情况下影响我的班级。

原文由 JonM 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏