【问题标题】:C++, Array size must be an const expression [duplicate]C ++,数组大小必须是常量表达式[重复]
【发布时间】:2015-05-28 06:54:44
【问题描述】:

我目前正在阅读 Lappman 的《C++ Primer》一书。在第 113 页它说

数组中元素的数量是数组类型的一部分。因此,维度必须 在编译时已知,这意味着维度必须是常数 表达。

另外它说我们不能做这样的事情

unsigned cnt  = 43; //not an const expression
string bad[cnt]; // error

但这不是真的,我编译它没有任何问题,我什至可以做这样的事情

int i;
cin >> i;
get_size(i);

void get_size(int size) {
  int arr[size];
  cout << sizeof (arr);
}

而且效果很好,那么为什么每本书都说必须在编译时知道数组大小?还是必须是const表达式?

【问题讨论】:

  • @juan:如果使用 Stack Overflow,请尝试在答案部分发布问题的答案。
  • @LightnessRacesinOrbit 我选择了一个合适的副本。人多的时候很难选择。

标签: c++ arrays


【解决方案1】:

因为那些书正在教你 C++。

真实的,在 C++ 中。

您使用的是 GCC 专门提供的非标准扩展,称为 可变长度数组

如果您打开所有编译器警告(您应该始终这样做),您将在构建期间收到相关通知。

【讨论】:

    【解决方案2】:

    这些被称为 VLA(可变长度数组),它们实际上是 standard in C99,尽管它们并不总是被认为是可接受的并且是 not required to be supported by the compiler as of C11。 GCC 允许它们作为 C++ 代码中的扩展。

    如果你想做一些实验,那么你可以使用-std=standard-ansi-pedantic 选项。

    您也可以参考这个问题:Why does a C/C++ compiler need know the size of an array at compile time?,其中接受的答案对此有很好的解释。

    【讨论】:

    • 但在 C++ 中不鼓励这样做。非常不便携且不必要。
    • @LightnessRacesinOrbit:- 是的,没错,这就是我添加 C99 部分的原因。
    • 我只是说这有点误导。您可以强调,就 this 问题而言,这不是“非常可接受且实际上是标准的”。
    • @LightnessRacesinOrbit:- 更新了。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2013-02-09
    • 2016-09-22
    相关资源
    最近更新 更多