为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
噜噜哒 2019-08-08 11:06:13
为什么C ++不允许使用匿名结构?一些C ++编译器允许匿名联合和结构作为标准C ++的扩展。这有点语法糖,偶尔会非常有帮助。阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?这是我正在谈论的样本:struct vector3 {   union {     struct {       float x;       float y;       float z;     };     float v[3];   };};我的编译器会接受这个,但它警告“无名结构/联合”是C ++的非标准扩展。
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

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

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

此外,C ++中的匿名结构没有多大用处。您演示使用,有包含三个浮筒,可要么由被称为一个结构.v[i],或者.x.y.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 ++的修订可能会添加它们。


查看完整回答
反对 回复 2019-08-08
?
holdtom

TA贡献1805条经验 获得超10个赞

我会说,你可以vector3通过使用一个来清理你的声明union

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

当然,匿名结构 MSVC扩展。但是ISO C11现在允许它gcc允许它,Apple的llvm编译器也是如此。

为什么在C11而不是C ++ 11?我不确定,但实际上大多数(gcc ++,MSVC ++和Apple的C ++编译器)C ++编译器都支持它们。


查看完整回答
反对 回复 2019-08-08
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

不明白你的意思。C ++规范的第9.5节,第2节:

形式的联合

union { member-specification } ;

被称为匿名联盟; 它定义了一个未命名类型的未命名对象。

你也可以做这样的事情:

void foo(){
  typedef
  struct { // unnamed, is that what you mean by anonymous?
    int a;
    char b;
  } MyStructType; // this is more of a "C" style, but valid C++ nonetheless

  struct { // an anonymous struct, not even typedef'd
    double x;
    double y;
  } point = { 1.0, 3.4 };}

并不总是非常有用...虽然有时在令人讨厌的宏定义中有用。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 661 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信