4

オブジェクトのサイズをゼロとして取得していますが、これはすべきではありません。なぜコンパイラがこの答えを出すのかという概念を説明してください。

  #include<iostream>
  using namespace std;

  class xxx{
      public: int a[];  // Why this line is not giving error.
  }; 

  int main(int argc, char *argv[])
  {
      xxx x1;
      cout<<sizeof(x1); //Q=Why this code is not giving error.
      return 0;
  }
4

4 に答える 4

4

他の人が言ったように、C++ のオブジェクトはサイズが 0 になることはありません。

ただし、コードはそもそも有効な C++ ではないため (配列を空にすることはできません)、これは重要ではありません。コンパイラは、必要なことだけを行います。

GCC with-pedanticこのコードは拒否されます。MSVC は少なくとも警告します。私のバージョンのclang++ICE-pedanticでは、その前に警告が表示されます。

于 2012-04-27T10:08:40.647 に答える
2

aクラス内のその要素xxxは、柔軟な配列メンバーと呼ばれます。

柔軟な配列メンバーは、C++ 標準にはありません。それらは C99 の一部です。ただし、多くのコンパイラ ベンダーは、柔軟な配列メンバーを C++ 拡張機能として提供しています。

そのままのコードは合法的な C コードではありません。C++ 固有の構造を使用します。コードを C に変更するのは簡単です。 を に変更classstruct、 を取り除き、publicC++ I/O の使用を C の に変更しますprintf。これらの変更により、変換されたコードは依然として違法な C99 コードです。柔軟な配列メンバーは、空でない構造体の最後の要素としてのみ許可されます。

どうやら、ベンダーは柔軟な配列メンバーの概念を C++ に引き継いだようですが、それ以外の場合は構造体が空でないという制約はありません。

于 2012-04-27T10:34:16.193 に答える
2

標準準拠のコンパイラを使用していません。オブジェクトのサイズを にすることはできません。0空であっても、classサイズstructがであっても1です。さらに、配列の次元を指定する必要があります。

編集: 奇妙なことに、ideone も 0 を出力します。MSVS では警告が表示されますが、少なくともサイズは 1 です。

5.3.3. のサイズ

  1. [...] クラスに適用すると、結果はそのクラスのオブジェクトのバイト数になります [...] 最も派生したクラスのサイズはゼロより大きくなければなりません。[...] sizeof を基本クラスのサブオブジェクトに適用した結果は、基本クラスの型のサイズになります。[...]

編集2:

MSVSで次のことを試しました:

xxx a[100];

コンパイルに失敗します。事前にエラーを検出しないのは奇妙です。

于 2012-04-27T10:01:20.410 に答える
1

オブジェクトのサイズをゼロにすることはできません。クラスが空であっても、そのサイズがゼロになることはありません。

詳細については、 Bjarne Stroustrup の C++ Style and Technique FAQのリンクを参照してください。

于 2012-04-27T10:07:52.027 に答える