1. ホーム
  2. c++

[解決済み] なぜC++は匿名構造体を禁止しているのですか?

2022-12-10 09:34:46

疑問点

C++コンパイラの中には、標準C++の拡張として、匿名組合や構造体を許可しているものがあります。 これはちょっとした構文上の糖分であり、時折とても役に立ちます。

これが標準の一部であることを妨げる根拠は何でしょうか?技術的な障害があるのでしょうか。哲学的なものですか? それとも、それを正当化するのに十分なニーズがないのでしょうか?

これがそのサンプルです。

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

私のコンパイラはこれを受け付けますが、次のような警告が出ます。 は C++ の非標準的な拡張です。 .

どのように解決するのですか?

他の人が指摘しているように、標準 C++ では匿名組合は許可されていますが、匿名構造体は許可されていません。

その理由は、C は匿名ユニオンをサポートしていますが、匿名構造体* はサポートしていないため、C++ は互換性のために前者をサポートしていますが、後者は互換性のために必要ないためサポートしていないのです。

さらに、C++では匿名構造体にはあまり使い道がありません。あなたが示した用途は、3 つの浮動小数点数を含む構造体を持ち、それを .v[i] または .x , .y そして .z は、C++では未定義の動作になると思います。C++では、ユニオンの1つのメンバーに対して、例えば .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]; }
};

* C11 は明らかに匿名構造体を追加しているので、C++ の将来のリビジョンで追加されるかもしれません。