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

Hat*_*ate 3 c++ arrays const visual-studio-2008 visual-c++

我有以下功能

 void someFun(int* ar, const int size) {
      int newAr[size];
      //do something 
 }
Run Code Online (Sandbox Code Playgroud)

我得到这一行三个错误:

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 
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*der 6

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

int* newAr = new int[size];
Run Code Online (Sandbox Code Playgroud)

或者更好地使用矢量:

std::vector<int>(size);
Run Code Online (Sandbox Code Playgroud)

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

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

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


AnT*_*AnT 6

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

仅仅因为你声明了一些int变量const并没有把它变成一个积分常量表达式.函数参数永远不会形成积分常数表达式.这就是为什么你不能使用你size在C++中定义数组大小.

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

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