VS2008错误要求在声明数组时使用常量表达式,但GCC中的此代码没有错误

VS2008 error expected constant expression on declaring array, but no error for this code in GCC

本文关键字:GCC 有错误 代码 表达式 常量 错误 声明 数组 VS2008      更新时间:2023-10-16

我有以下函数

 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 

但是varsize是常量!使用gcc,编译时不会出现错误。你能告诉我vs2008(或者一般的Visual C++)哪里出了问题,为什么出了问题吗?提前谢谢。

size不是常量表达式。错误消息中的术语"常量表达式"指的是积分常量表达式的C++概念。积分常数表达式的全部思想是,它的值应该在编译时已知。例如,使用初始值设定项声明为的积分const对象可以用作积分常量表达式。

仅仅因为您声明了某个int变量const,并不会将其转化为积分常量表达式。函数参数从不形成积分常数表达式。这就是为什么不能使用size在C++中定义数组大小的原因。

GCC编译代码是因为它将C语言的C特定特性作为非标准扩展引入C++。请注意,在GCC中,size也不被认为是常数。GCC并不要求数组大小保持恒定。

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

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

int* newAr = new int[size];

或者更好地使用矢量:

std::vector<int>(size);

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

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

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

参数const int size并不意味着size是编译时常数。这只是意味着在someFun中,不能更改size的值。然而,size的值可以在someFun的不同调用之间改变。

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