C 中不允许使用匿名结构的基本原理
C 编译器可能允许使用匿名联合和结构作为标准的扩展。然而,标准本身只允许匿名联合,而不允许匿名结构。这种差异背后的原因是什么?
原因源于与 C 的兼容性。C 支持匿名联合,但不支持匿名结构。为了实现兼容性,C 将匿名联合合并到其语言中。但是,C 中没有与匿名结构兼容的要求,因此标准中省略了它们。
此外,匿名结构在 C 中没有什么用处。提供的示例中,一个结构体包含三个可通过 .v[i] 和 .x、.y、.z 访问的浮点数,在 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]; } };
此代码提供了所需的功能,同时遵守 C 标准。谨慎的做法是使用定义的结构而不是匿名结构来管理数据,即使它们在某些编译器扩展中是可能的。
以上是为什么 C 不允许匿名结构而允许匿名联合?的详细内容。更多信息请关注PHP中文网其他相关文章!