声明数组时VS2008错误预期常量表达式,但GCC中此代码没有错误

时间:2013-07-03 22:16:20

标签: c++ arrays visual-c++ visual-studio-2008 const

我有以下功能

 void someFun(int* ar, const int size) {
      int newAr[size];
      //do something 
 }

我得到这一行三个错误:

Error   1   error C2057: expected constant expression   
Error   2   error C2466: cannot allocate an array of constant size 0    
Error   3   error C2133: 'newAr' : unknown size 

但var 大小是不变的!使用gcc编译时没有错误。你能告诉我vs2008(或者一般来说可能是Visual C ++)的错误是什么?为什么?提前谢谢。

3 个答案:

答案 0 :(得分:6)

静态数组的大小必须在编译时知道(因此它不能是变量,const关键字意味着变量不能更改,但并不意味着变量在程序的整个长度上都是常量而且更少在编译时知道)。你必须做这样的事情:

int* newAr = new int[size];

或更好地使用矢量:

std::vector<int>(size);

我建议向量动态分配数组的原因是,对于数组,你必须记住在完成它之后释放内存,否则你会泄漏它。然而,使用向量,它将管理它自己的内存。

您可以获取有关矢量here的其他信息。我强烈建议你阅读它们,它们非常有用,在我的情况下是我大部分时间都可以使用的第一个容器。

P.S:克里斯提到它在gcc中工作的原因是因为gcc有能力这样做一段时间,但它是一个非标准的扩展,因此不可移植。幸运的是,我相信它已经被输入到C ++ 14标准草案中,这意味着很快/大多数编译器都会支持它。

答案 1 :(得分:6)

size不是常量表达式。错误消息中的术语“常量表达式”指的是积分常量表达式的C ++概念。 Integral Constant Expression的整个思想是它的值应该在编译时知道。例如,使用初始化程序声明的整数const对象可以用作积分常量表达式。

仅仅因为您声明了一些int变量const并未将其转换为积分常量表达式。函数参数永远不会形成积分常数表达式。这就是您无法使用size在C ++中定义数组大小的原因。

GCC编译您的代码,因为它将C语言的C特定功能作为非标准扩展从C ++引入。请注意,在GCC中,您的size也不会被视为常量。 GCC根本不需要数组大小保持不变。

如果将GCC编译器切换到严格且迂腐的C ++模式,它将拒绝像MSVC ++一样编译代码。

答案 2 :(得分:3)

参数const int size并不意味着size是编译时常量。它只是意味着在someFun中,您无法更改size的值。但是,size的值可以在someFun的不同调用之间更改。

C / C ++中的数组需要具有编译时已知的大小。