一些 C++ 编译器允许匿名联合和结构作为标准 C++ 的扩展。这是一些语法糖,偶尔会很有帮助。
阻止它成为标准一部分的理由是什么?有技术障碍吗?一个哲学的?或者只是不足以证明它的合理性?
这是我正在谈论的示例:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
我的编译器会接受这一点,但它警告说 “无名结构/联合”是 C++ 的非标准扩展。
原文由 Adrian McCarthy 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如其他人指出的那样,标准 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++ 的用户定义类型工具提供了替代解决方案。例如:
\* C11 显然添加了匿名结构,因此未来对 C++ 的修订可能会添加它们。