ホームページ >バックエンド開発 >C++ >C の匿名構造体は標準に準拠していますか?

C の匿名構造体は標準に準拠していますか?

DDD
DDDオリジナル
2024-12-07 07:30:12451ブラウズ

Are Anonymous Structs in C   Standard Compliant?

匿名構造体: 標準か非標準か?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。