【问题标题】:Initializing array of structs within an array of structs在结构数组中初始化结构数组
【发布时间】:2012-05-02 02:09:22
【问题描述】:

给定以下代码:

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]'.

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

【问题讨论】:

    标签: c++ gcc struct object-initializers


    【解决方案1】:

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

    试试BufferPair[2] 看看是否能解决问题。

    【讨论】:

      【解决方案2】:
      struct TestData
      {
          MyClass _myClass;
          BufferPair _data[];
      };
      

      上面代码中的_data不是完整类型(它缺少数组的大小),并且在C++标准中不允许将成员声明为不完整类型:

      9.2p10

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

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

      【讨论】:

      • 很好奇。哪个扩展允许这样做?
      • @MarkP: 搜索gcc array member size 我发现this 是C 的扩展,它也可能在C++ 中可用......但无论如何,在C++ 中你应该避免使用它,因为它不是标准的。
      【解决方案3】:

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

      有关如何执行此操作的更多信息,请参阅此帖子 Allocating struct with variable length array member

      【讨论】:

        猜你喜欢
        • 2015-07-29
        • 1970-01-01
        • 2021-04-30
        • 2022-01-13
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多