C++ 在结构数组中初始化结构数组

C++ 在结构数组中初始化结构数组,c++,gcc,struct,object-initializers,C++,Gcc,Struct,Object Initializers,给定以下代码: struct BufferPair { ByteBuffer _a; ByteBuffer _b; bool _c; }; struct TestData { MyClass _myClass; BufferPair _data[]; }; 我试图初始化TestData数组,其中我还初始化了BufferPair数组。TestData的每个实例都有一个大小不同的缓冲对数组。简化示例: const TestData g_Data[] =

给定以下代码:

struct BufferPair
{
    ByteBuffer _a;
    ByteBuffer _b;

    bool _c;
};

struct TestData
{
    MyClass _myClass;

    BufferPair _data[];
};
我试图初始化TestData数组,其中我还初始化了BufferPair数组。TestData的每个实例都有一个大小不同的缓冲对数组。简化示例:

const TestData g_Data[] = { MyClass(), { { bufOne, bufTwo, someBool }, { bufThree, bufFour, anotherBool } } };
尝试此操作时,我遇到以下gcc错误:

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

我该如何解决这个问题?谢谢。

您没有写入数组的大小
BufferPair[]
-它是零,因此不能用值填充它

尝试
BufferPair[2]
,看看这是否解决了问题

struct TestData
{
    MyClass _myClass;
    BufferPair _data[];
};
<以上代码中的代码>数据> <代码>不是完整的类型(缺少数组的大小),并且不允许在C++标准中声明成员为不完整类型:

9.2p10

非静态(9.4)数据成员的类型不得不完整


这似乎是作为gcc语言的扩展进行编译的。现在它仍然无法编译变量的定义,因为数组没有大小,而您正试图初始化其中的成员。

正如其他答案中所述,您无法初始化没有长度的数组。 唯一的方法是在运行时使用“长度1技巧”(如果使用gcc,则使用长度0技巧)初始化结构

有关如何做到这一点的更多信息,请参阅本文

好奇。哪一个扩展允许这样做?@ MARP:搜索<代码> GCC数组成员大小< /C> >我发现这是C的扩展,它也可以在C++中使用…但是无论如何,C++中应该避免使用它,因为它不是标准的。