匿名结构:标准与否?
根据 MSDN,匿名结构在 C 中是非标准的。然而,这种说法提出了这种区别是否准确的问题。
标准未命名结构
C 标准(C 03 和 C 11)允许创建未命名结构如下:
struct { int hi; int bye; };
这些未命名结构可以是实例化为其他结构体的成员:
struct Foo { struct { int hi; int bye; } bar; };
Visual C 和 GCC 中的匿名结构
Visual C 和 GCC 中通常所说的“匿名结构体”略有不同。这些结构还允许直接通过父对象访问成员:
struct Foo { struct { // No member name int hi; int bye; }; }; int main() { Foo f; f.hi = 3; // Access member without using nested struct }
非标准匿名结构
直接通过父对象访问成员的功能不具备标准。它是 Visual C 和 GCC 支持的 Microsoft 扩展。 Windows API 标头利用了这种“匿名结构”功能。但是,可以通过在包含 Windows 头文件之前定义 NONAMELESSUNION 来禁用它。
与匿名联合的区别
标准匿名联合还提供直接通过父对象访问成员的方式。例如:
struct Foo { union { // No member name int hi; int bye; }; }; int main() { Foo f; f.hi = 3; // Access member without using nested union }
结论
标准中的术语“未命名结构”指的是整体类型,而Visual中使用的术语“匿名结构” C和GCC指的是直接通过父对象访问成员的能力。后一个功能是非标准的,尽管它仍然受到流行编译器的广泛支持。
以上是C 标准中的匿名结构是否符合标准?的详细内容。更多信息请关注PHP中文网其他相关文章!