将大小设置为结构类型全局变量时的编译器错误

时间:2014-03-01 10:45:46

标签: c++ string struct

我收到编译错误:

scheduleA3.cpp:97:16: error: variable length array of non-POD element type 'Section'
Section section[jk[1]];

我有一个结构:

struct Section
{ 
int places;
string cities;
}; 

我将此语句后的全局变量声明为Section section[jk[1]];

问题在于我无法设置自定义索引长度jk是一个充当全局变量计数器的数组。如果我设置Section部分[0],那么一切都会编译。有关编译器限制使用自定义索引大小的原因吗?感谢所有的帮助,让我知道我是否可以帮助减少我的问题。

4 个答案:

答案 0 :(得分:2)

如果在编译时不知道数组的大小,则可以改为使用向量:

#include <vector>

std::vector<Section> section(jk[1]);

答案 1 :(得分:2)

基于运行时值jk[1]的静态数组的大小是不可能的,因为全局存储是在程序有机会运行之前静态分配的。 C ++要求全局数组的大小是编译时常量。

jk[1]的值可能会在程序的整个生命周期中发生变化。数组的大小设置一次,永远不会改变。如果您需要提供可以调整大小的全局可用结构,请使用C ++集合之一,并动态填充它。

答案 2 :(得分:0)

新标准支持,我的编译器是gcc版本4.1.2,可以编译并运行正常

答案 3 :(得分:-1)

问题是您的类型Section是非POD(普通旧数据)类型。如果它就像你在上面显示的那样,你的代码就可以工作,因为当前版本的C标准允许可变长度数组,而许多C ++编译器实现可变长度数组作为扩展。 (注意:当我最初写这篇文章时,我以为你在讨论函数中的可变长度数组,而不是全局。我不知道全局的VLA会在任何地方工作,除非表达式解析为一个常量,即使这样,在某些情况下你也可能依赖于编译器。)

POD或Plain Old Data类型本质上是内置类型,加上structclass es由这些类型组成,只要它们没有明确定义的构造函数(编译器 - 定义的默认构造函数很好)或protectedprivatestatic数据成员。对于C ++ 98,请参阅this Stack Overflow answer; C ++ 11稍微改变了规则,所以如果你使用支持它的编译器,那么你可能还想阅读this answer too

正如已经提到的,如果你有一个非POD类型并且想要一个可变长度数组,你应该使用std::vector代替,例如。

#include <vector>

std::vector<Section> section(jk[1]);

另请注意,使用自动存储声明的可变长度数组(函数中的默认值)通常会在堆栈上分配,而std::vector将使用堆< / em>的。某些平台上的堆栈内存是有限的,即使它不是堆栈必须在内存中连续(与堆不同),这使得扩展困难,因此对于使用std::vector的较大阵列是一个更好的主意。