2012-04-20 51 views
2

阵列内结构的数组:初始化考虑下面的代码结构

struct BufferPair 
{ 
    ByteBuffer _a; 
    ByteBuffer _b; 

    bool _c; 
}; 

struct TestData 
{ 
    MyClass _myClass; 

    BufferPair _data[]; 
}; 

我试图初始化TESTDATA数组,其中我也初始化BufferPair的数组。 TestData的每个实例都有一个不同大小的BufferPair数组。简单的例子:

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

在尝试,我得到了以下的gcc错误:

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

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

回答

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

在上面的代码_data不是完整的类型(它缺乏数组的大小),并且不允许声明一个构件是在C++标准不完整的类型的:

9.2p10

Non-static (9.4) data members shall not have incomplete types.

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

+0

好奇的更多信息。哪个扩展允许这个? – MarkP 2012-04-20 13:51:35

+0

@MarkP:搜索'gcc数组成员大小'我发现[this](http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html),它是C的扩展,也可能可用在C++中...但无论如何,在C++中,你应该避免使用它,因为它不是标准的。 – 2012-04-20 13:58:21

1

你没有写出数组的大小BufferPair[] - 它是零,所以你不能用值填充它。

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

0

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

看到这个职位上如何做到这一点 Allocating struct with variable length array member