奇怪的不完整类型不允许错误

  • 本文关键字:类型 不允许 错误 c++
  • 更新时间 :
  • 英文 :


请考虑以下代码

struct dummy1 {
    int b;
    dummy1();
};
struct dummy {
    dummy1 a[];
    int c;
    dummy();
};
int main()
{
    dummy foo;
    foo.a[0].b = 5;
    foo.a[1].b = 6;
    return 0;
}
dummy::dummy()
    :a()
    ,c()
{
}
dummy1::dummy1()
    : b()
{
}

收到一个错误"不允许不完整的类型",据我所知,如果未定义我们正在定义对象的结构或不包含头文件,则会出现此错误,当我在a[]代码工作之前定义我的int c时,情况并不奇怪,因此替换它

struct dummy {
    int c;
    dummy1 a[];
    dummy();
};

代码工作得很好,有什么想法为什么会发生这种情况吗?

附言我正在使用VS2015

dummy1 a[];无效

。 您必须定义数组的大小。 如果您事先不知道需要什么大小的数组,请使用 std::vector 而不是原始数组:

struct dummy {
    std::vector<dummy1> a;
    int c;
};
int main()
{
    dummy foo;
    foo.a.resize(2);
    foo.a[0].b = 5;
    foo.a[1].b = 6;
}

当您交换成员的顺序时,它编译的原因是 C 的一项功能,称为"灵活数组成员",某些编译器作为C++的扩展提供该功能。 这允许您将未知绑定数组声明为结构的最后一个成员。 但是,当您声明该类型的自动或静态变量时,不会为该数组保留内存。 它旨在与malloc一起使用:

struct dummy {
    int c;
    dummy1 a[];
};
int main() {
    // allocate storage for 5 dummy1 objects in our flexible array
    dummy* foo = malloc(sizeof(dummy) + 5 * sizeof(dummy1));
    foo->a[0].b = 5;
    foo->a[1].b = 6;
    free(foo);
    return 0;
}

请注意,这不是C++的标准部分。 它是一个非标准的编译器扩展,不能很好地与许多C++功能配合使用。 编译器可能提供此扩展主要是为了与用 C 编写的库兼容。

我想它是虚拟大小为 0 的数组 a。标准不允许这样做。

尝试:

struct dummy {
   dummy1* a;
   int c;
   dummy();
};

或:

struct dummy {
   dummy1 a[1];
   int c;
   dummy();
};

最新更新