2

次のコードがあるとします。

struct BufferPair
{
    ByteBuffer _a;
    ByteBuffer _b;

    bool _c;
};

struct TestData
{
    MyClass _myClass;

    BufferPair _data[];
};

BufferPair の配列も初期化する TestData の配列を初期化しようとしています。TestData の各インスタンスには、異なるサイズの BufferPair 配列があります。簡単な例:

const TestData g_Data[] = { MyClass(), { { bufOne, bufTwo, someBool }, { bufThree, bufFour, anotherBool } } };

これを試しているときに、次の gcc エラーが発生します。

error: too many initializers for 'BufferPair [0]'.

どうすればこれを解決できますか? ありがとう。

4

3 に答える 3

2
struct TestData
{
    MyClass _myClass;
    BufferPair _data[];
};

_data上記のコードでは完全な型ではなく(配列のサイズが不足しています)、C++標準でメンバーを不完全な型であると宣言することは許可されていません。

9.2p10

非静的(9.4)データメンバーは、不完全なタイプであってはなりません。

これは、gccの言語の拡張としてコンパイルされるようです。配列にサイズがなく、その中のメンバーを初期化しようとしているため、変数の定義をコンパイルできません。

于 2012-04-20T13:27:19.087 に答える
1

配列のサイズを記述していませんBufferPair[]。ゼロであるため、値を入力することはできません。

BufferPair[2]これで問題が解決するかどうか試してみてください。

于 2012-04-20T13:26:24.350 に答える
0

他の回答で述べたように、長さなしで配列を初期化することはできません。これを行う唯一の方法は、実行時に「長さ 1 のトリック」(gcc を使用している場合は長さ 0 のトリック) を使用して構造体を初期化することです。

その方法の詳細については、この投稿を参照してください 可変長配列メンバーを持つ構造体の割り当て

于 2012-04-20T13:31:48.697 に答える