【问题标题】:Array Size Declaration issue [duplicate]数组大小声明问题[重复]
【发布时间】:2014-12-29 22:21:48
【问题描述】:
int n=5;
int arr[n];

我想在 C++ 中像上面一样声明数组的大小,但编译时出错。我在互联网上发现很多代码使用这些类型的声明而不是简单地放置int arr[5]。代码如何为他们成功编译,但对我却没有。 P.S:我使用 windows7 和 Visual Studio(IDE)。

错误信息:表达式必须有一个常数值

【问题讨论】:

  • @juan:那不是重复的。

标签: c++


【解决方案1】:

数组的元素个数,数组绑定,必须是常量表达式。

你必须使用

const int n = 5;

constexpr int n = 5;

否则它是一个非标准扩展:可变长度数组 (VLA)。

【讨论】:

  • 它现在对我有用。你能用更通俗的话解释一下为什么当我只使用int 而不是const int 时它没有更早编译。
  • 是不是和 Visual Studio 有关系?
  • 更好的是,不要使用 C 数组。
  • 使用int,您没有常量表达式。一些编译器可能会提供扩展以允许您的代码,但是您的代码不可移植,并且不会为所有编译器编译。
  • @Unbreakable:VLA 是一个固定大小的数组(大小在运行时已知),vector 是一个动态可调整大小的数组。
【解决方案2】:

错误消息实际上很好地描述了正在发生的事情:C++ 不支持具有非常量大小的数组(更准确地说,需要在编译时知道大小)。

对此有两种解决方案:

  1. 如果大小实际上是一个常量,则声明为constexpr(如果不能使用C++11,也可以使用const):

    constexpr int n = 5;
    std::array<int, n> arr;
    

    这需要标准标题&lt;array&gt;。或者,如果您不能使用 C++11,请将第二行更改为

    int arr[n];
    
  2. 如果在编译时不知道大小,不要使用静态数组,而是使用动态容器:

    int n = 5;
    std::vector<int> arr(n);
    

    这需要&lt;vector&gt; 标准标头。

【讨论】:

  • std::array 需要&lt;array&gt; 标准标头。
  • 我明白你的意思。但是我现在对 VLA 和 Vectors 感到困惑。它们之间是否有某种联系。因为我们可以在运行时更改数组的容量。
  • @Unbreakable VLA 和向量有根本的不同:​​VLA 存储在堆栈上,这通常不是一个好主意(堆栈大小受到严格限制,如果不控制编译时的数组可能太大)。相比之下,向量将实际数据存储在堆上,其中大小是一个 小问题。此外,VLA 目前根本不是有效的 C++,而且并非所有编译器都支持它。然而,未来的 C++ 版本将支持 VLA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多