【问题标题】:MS Visual Studio Error: Expected Constant ExpressionMS Visual Studio 错误:预期的常量表达式
【发布时间】:2017-07-24 10:52:12
【问题描述】:

获取以下代码。

#include "iostream"
using namespace std;
unsigned power(unsigned b, unsigned e){return e?b*power(b, e-1):1;}//Raises base b to a power e
int main(int argc, char* argv[])
{const unsigned lev=5, len=power(2, lev)-1;
int arr[len]; //Error according to Microsoft visual studio
cout<<"The code worked."<<endl;
}

我的代码块编译器可以很好地分配数组,但 Microsoft Visual Studio 表示该行需要一个常量表达式。

我了解堆栈和堆动态分配之间的区别。但是在这种情况下,参数len 无论如何都是在编译时静态确定的。我将值存储在一个变量中(而不是直接使用 5),只是因为我的测试用例在每次运行程序时使用不同的len

那么有什么方法可以让 Visual Studio 使用它吗?或者我应该诉诸动态分配,即使 CodeBlock 接受它?

【问题讨论】:

  • 无法重现(VS2013)。您使用的是哪个 Visual Studio?
  • Can not replicate。请创建一个Minimal, Complete, and Verifiable Example 并向我们展示。
  • 我正在使用 VS 2010。
  • 将你的函数标记为constexpr
  • 编译时常量和一旦初始化就不能修改的变量是有区别的。

标签: c++ visual-studio ide heap-memory dynamic-memory-allocation


【解决方案1】:
int arr[len];

len 不是编译时常量表达式(毕竟它需要用power 函数计算)。

C(相对于 C++)允许在运行时才知道长度的数组。这些被称为“可变长度数组”(VLA)。

因此,您的代码不是有效的 C++。它适用于 GCC,因为该编译器(默认情况下)通过一些额外的“特性”扩展了 C++,VLA 就是其中之一。


但是在这种情况下,参数len 无论如何都是在编译时静态确定的。

不,它被初始化为power 函数的返回值。 C++(默认)不允许“超级编译”(执行任意数量的代码,被认为具有恒定的结果),因此该函数只能在运行时调用。

从 C++11 开始,有 constexpr 关键字,它允许您标记某些(受限)函数,以便它们在编译时执行,而它们的参数是编译时常量。

【讨论】:

  • 是的,但是函数power可以变成constexpr
  • @mpiatek 确实,添加了关于 constexpr 的简短说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
相关资源
最近更新 更多