c++ - C++ 编译器中的可变长度数组 (VLA)

标签 c++ dynamic-arrays

我们已经知道,VLA (在 C99 中标准化)不是 C++ 标准的一部分。

所以下面的代码在 C++ 中是“非法的”:

void foo(int n) {
  int vla[n];
  for (int i = 0; i < n; ++i) {
    vla[i] = i;
  }
}

尽管如此,编译器(g++clang++)接受代码作为有效语法,只产生一个警告 以防 -pedantic 标志启用

ISO C++ forbids variable length array ‘vla’ [-Wvla]

我的问题是:

  • 为什么编译器接受该声明?
    编译器不能拒绝长度为[is-no-know-at-compile-time]的数组?
    是否有某种兼容性语法规则可遵循?

  • 标准说明了什么?
    从生成的汇编代码中,我看到编译器在堆栈中写入 在循环中,就像普通数组一样,但我找不到任何关于标准行为的信息。

最佳答案

Why does the compiler accept that declaration?

因为它的作者选择让它这样做。

GCC 特别允许,默认情况下,许多非标准的东西在历史上被旧的 C 编译器接受。他们喜欢这种意义上的“兼容性”。

What does the standard say about [it]?

准确地说是警告中的内容:ISO C++ 禁止可变长度数组。

C++ 没有 VLA。

在你看到一个被接受的地方,它是一个编译器扩展;要了解该编译器如何实现此类扩展,您必须询问编译器的作者(或检查其源代码,如果适用)。

关于c++ - C++ 编译器中的可变长度数组 (VLA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936232/

相关文章:

c++ - 使用 D3DX11CreateShaderResourceViewFromFile 加载 .PSD 文件

c++ - Eclipse 索引器不工作

c++ - 将函数参数添加到 vector

arrays - 如何在Solidity中创建动态内存数组?

javascript - JS : How to create an array containing permutations of a sequence 0 to n in which adjacent numbers must have a difference greater than 1?

c++ - 为什么在下面的代码中调用了第一个复制构造函数?

c++ - 如何连接 "constant strings"和字符?

C++ 动态数组输入

复制指针值

c - 可以在 C 中返回和释放动态分配的数组吗?