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