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

时间:2016-09-05 16:20:31

标签: 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 ++禁止变长数组'vla'[-Wvla]

我的问题是:

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

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

2 个答案:

答案 0 :(得分:8)

  

为什么编译器接受该声明?

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

默认情况下,GCC特别允许旧C编译器历史上接受的许多非标准内容。他们喜欢&#34;兼容性&#34;从那个意义上说。

  

标准对[它]说了什么?

确切地说明了它所说的警告:ISO C ++禁止变长数组。

C ++没有VLA。

如果您看到一个被接受,那么它是一个编译器扩展;要了解编译器如何实现这样的扩展,您必须询问编译器的作者(或检查其来源,如果适用)。

答案 1 :(得分:1)

该标准要求符合标准的编译器在遇到非法内容时必须“发出诊断信息”。完成后,可以继续编译具有特定于实现的含义的代码。 (请注意,“具有特定于实现的含义”是“具有未定义行为”的礼貌形式)。