【问题标题】:VS2008 error expected constant expression on declaring array, but no error for this code in GCCVS2008 在声明数组时出现错误预期的常量表达式,但在 GCC 中此代码没有错误
【发布时间】:2013-07-01 19:01:58
【问题描述】:

我有以下功能

 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 size 是不变的!并且使用 gcc 编译没有错误。你能告诉我 vs2008 (或者一般的 Visual C++ 可能)这里有什么错误以及为什么错误吗?提前致谢。

【问题讨论】:

  • 回答您的问题,在 C++14 标准化之前,它是一个编译器扩展。

标签: c++ arrays visual-c++ visual-studio-2008 constants


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    int* newAr = new int[size];
    

    或者更好的是使用向量:

    std::vector<int>(size);
    

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多