2014-03-01 28 views
0

我收到编译器错误:编译器错误设置大小为结构类型时,全局变量

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是一个数组,它也是一个全局变量的计数器。如果我设置节节[0],则编译所有内容。关于为什么编译器限制使用自定义索引大小的任何想法?感谢所有的帮助,并让我知道我是否可以帮助我的问题不太模糊。

+0

编译器试图实现C++标准中定义的语言,该标准不允许自动或静态存储阵列的大小不是编译时常量。 – juanchopanza

回答

2

如果你不知道数组在编译时的大小,可以用向量来代替:

#include <vector> 

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

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

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

-1

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

POD或Plain Old数据类型基本上是内置类型,再加上这些类型的struct s和class es,只要它们没有明确定义的构造函数(编译器定义的默认构造函数都可以)或protectedprivatestatic数据成员。对于C++ 98,请参阅this Stack Overflow answer; C++ 11稍微改变了一些规则,所以如果你使用的是支持该规则的编译器,那么你也可以阅读this answer too。如前所述,如果你有一个非POD类型并且想要一个可变长度数组,你应该使用std::vector来代替,例如,如果你有一个非POD类型并且想要一个可变长度数组,那么你应该使用std::vector

#include <vector> 

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

注意也具有自动存储(在函数内部缺省值)宣称可变长度阵列将通常的堆栈上进行分配,而std::vector将使用。堆栈内存在某些平台上是有限的,即使堆栈不是堆栈内存(与堆不同),这使得扩展很困难,因此对于使用std::vector的较大阵列来说是一个更好的主意。

+0

当前版本的C++标准当然*不允许变长数组。 IIRC,下一个标准将会。 – juanchopanza

+0

@juanchopanza你的意思是,它不允许* global *可变长度数组,对吧? – alastair

+0

不,我的意思是它不允许长度可变的数组,句号。 – juanchopanza

0

新的标准支持,我的编译器是gcc版本4.1。2编译并运行正常

+0

这是一个编译器扩展。它目前不是标准的C++。 – juanchopanza