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

时间:2019-06-03 11:56:39

标签: 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()
{

}

我收到一个错误“不允许使用不完整的类型”,据我所知,如果我们定义对象的结构未定义或没有包含头文件,则会出现此错误,这并非奇怪当我在int c之前定义a[]时,代码有效,因此替换此

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

};

代码工作正常,为什么会发生这种情况?

P.S我正在使用VS2015

2 个答案:

答案 0 :(得分:4)

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 ++的扩展。这使您可以将unknown-bound数组声明为结构的最后一个成员。但是,当您声明该类型的自动或静态变量时,不会为该数组保留任何内存。它打算与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编写的库兼容。

答案 1 :(得分:1)

我猜这是哑元中大小为0的数组a。该标准不允许这样做。

尝试:

struct dummy {

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

或者:

struct dummy {

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