请考虑以下代码
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();
};