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标准化为止。