为什么C禁止匿名结构?

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

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

这是我正在谈论的样本:

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

我的编译器会接受这个,但它会警告“nameless struct/union” is a non-standard extension to C++.

解决方法:

正如其他人所指出的那样,标准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的未来修订可能会添加它们.

上一篇:c – 不受限制的联合需要放置new和构造函数定义吗?


下一篇:c – 没有union的hashcode的内存地址