3

我有以下功能

 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++ 可能)这里有什么错误以及为什么错误吗?提前致谢。

4

3 回答 3

6

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

int* newAr = new int[size];

或者更好的是使用向量:

std::vector<int>(size);

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

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

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

于 2013-07-03T22:20:23.343 回答
6

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

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

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

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

于 2013-07-03T22:31:02.863 回答
3

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

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

于 2013-07-03T22:19:30.980 回答