好吧,您创建的不是变量数组。这是一个大小未知的数组。该数组的类型不完整,因此不能在 C++ 中定义。你能做的就是把它放在extern
它前面,让它成为一个声明。
extern coords MyCoords[];
然后,在初始化它的 .cpp 文件中,您可以创建(定义)该数组 - 请注意,您应该在命名空间范围内执行此操作,当然,在任何函数之外:
coords MyCoords[] = {{1, 2}, {3, 4}, ... };
如果你想要的是一个数组,它的大小在编译时未知,而是在运行时,你应该使用std::vector
:
std::vector< coords > MyCoords;
然后稍后如果你填写它,做
MyCoords.push_back( coords(1, 2) );
MyCoords.push_back( coords(3, 4) );
....
或者创建一个本地数组,然后使用该数组元素的副本初始化向量:
coords c[] = ....;
MyCoords.insert(MyCoords.end(), c, c + sizeof c / sizeof *c);
嗯,在 C 中,它与在 C++ 中略有不同。您可以定义一个维度未知的数组。发生的事情是它被视为“暂定”定义。如果在文件的末尾(更准确地说,它的翻译单元,即该文件,以及它包含的所有文件 - 意味着编译器一起翻译的所有内容)没有包含大小的后续定义,那么大小被认为是1
。但是,在 C++ 中没有暂定定义,不包含大小且不包含可以判断大小的初始化程序的定义是无效的 C++ 程序。
由于您的代码变得贪婪的原因,您正在做
MyCoords[0] = {0, 0}
编译器将读取为:
-> Set LHS to RHS
-> -> LHS is a variable of type `coords`. Fine
-> -> RHS is... hmm, `{0, 0}`. What the heck is it??
你看,编译器不知道右手边应该是什么意思。出于这个原因,C99(C 的 1999 版)引入了所谓的复合文字。它允许你写
MyCoords[0] = (coords){0, 0};
它实际上会做你想做的事——创建一个右侧的类型值coord
并将其分配给左侧。但是,出于兼容性原因(许多 C 编译器不合理地兼容 C99 - C++ 和 C89 都不支持复合文字),您应该使用我之前向您展示的方法之一。