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

众所周知,VLA(在C99中标准化)不是C ++中标准的一部分。


因此,下面的代码在C ++中是“非法的”:


void foo(int n) {

  int vla[n];

  for (int i = 0; i < n; ++i) {

    vla[i] = i;

  }

}

尽管编译器(g ++和clang ++)将代码作为有效语法接受,但如果启用了flag,则仅生成警告 。-pedantic


ISO C ++禁止使用可变长度数组'vla'[-Wvla]


我的问题是:


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

编译器不能只拒绝长度为[is-no-know-at-compile-time]?的数组?

是否要遵循某种兼容语法规则?


标准怎么说?

从生成的汇编代码中,我看到编译器像正常数组一样在循环中写在堆栈中,但是我找不到关于标准行为的任何信息。


哆啦的时光机
浏览 541回答 3
3回答

心有法竹

为什么编译器接受该声明?因为它的作者选择这样做。尤其是默认情况下,GCC允许许多非标准的东西,这些东西过去一直被旧的C编译器接受。他们喜欢这种意义上的“兼容性”。该标准对[it]说了些什么?确切地说,警告指出:ISO C ++禁止使用可变长度数组。C ++没有VLA。在您看到一个被接受的地方,它是编译器扩展;要了解该编译器如何实现这种扩展,您必须询问编译器的作者(或检查其来源,如果适用)。

胡子哥哥

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

森栏

“禁止”有点强。通常,该标准不禁止扩展。只要实现能够正确处理格式正确的程序并发出所需的诊断信息,它就是合规实现。如果该实现还为某些格式错误的程序提供了可再现的行为,则它仍然是兼容的。该标准不关心格式错误的程序。
打开App,查看更多内容
随时随地看视频慕课网APP