匿名構造体: 標準か非標準か?
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 中国語 Web サイトの他の関連記事を参照してください。