Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2008错误要求声明数组上有常量表达式,但GCC中此代码没有错误_C++_Arrays_Visual C++_Visual Studio 2008_Constants - Fatal编程技术网

C++ VS2008错误要求声明数组上有常量表达式,但GCC中此代码没有错误

C++ VS2008错误要求声明数组上有常量表达式,但GCC中此代码没有错误,c++,arrays,visual-c++,visual-studio-2008,constants,C++,Arrays,Visual C++,Visual Studio 2008,Constants,我有以下功能 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 e

我有以下功能

 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(或者VisualC++)可能是什么错误吗?提前感谢。

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


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

静态数组的大小必须在编译时已知(因此它不能是变量,const关键字意味着变量不能更改,但并不意味着变量在整个程序长度上是恒定的,在编译时更不为人所知)。您必须执行以下操作:

int* newAr = new int[size];
或者最好使用向量:

std::vector<int>(size);
std::vector(大小);
我建议vector优先于动态分配数组的原因是,使用数组时,必须记住在使用完内存后释放内存,否则会泄漏内存。然而,使用向量,它将管理自己的内存

您可以获得有关向量的其他信息。我强烈建议你仔细阅读它们,它们非常有用,对我来说,它们是我大部分时间接触到的第一个容器


注:正如chris提到的,它在gcc中工作的原因是因为gcc有能力做这件事,但它是一个非标准的扩展,因此不可移植。幸运的是,我相信它已经进入了C++14标准草案,这意味着很快大多数/所有编译器都会支持它。

size
不是一个固定的表达式。错误消息中的“常量表达式”是指积分常量表达式的C++概念。整型常量表达式的整体思想是,它的值应该在编译时就知道。例如,使用初始值设定项声明的整型
const
对象可以用作整型常量表达式

仅仅因为您声明了一些
int
变量
const
并没有将其转换为整型常量表达式。函数参数永远不会形成积分常量表达式。这就是为什么不能使用<代码>大小>代码来定义C++中的数组大小的原因。

GCC编译代码,因为它将C语言特性引入到C语言到C++中作为非标准扩展。请注意,在GCC中,您的

大小也不是常量。GCC并不要求数组大小保持不变


<>如果你将GCC编译器转换成严格的迂腐的C++模式,它将拒绝像MSVC++那样编译你的代码。

回答你的问题,它是编译器扩展,直到C++ 14标准化为止。