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

Nov*_*per 1 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()
{

}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误“不完整的类型是不允许的”,据我所知,如果我们定义对象的结构没有定义或者头文件没有包含在我定义的情况下,我们会得到这个错误。我int ca[]代码工作之前所以替换它

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

};
Run Code Online (Sandbox Code Playgroud)

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

PS我使用的是VS2015

Mil*_*nek 5

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;
}
Run Code Online (Sandbox Code Playgroud)

当您交换成员的顺序时,它编译的原因是 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;
}
Run Code Online (Sandbox Code Playgroud)

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