正如我们所知,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]
的数组?
是否存在一种兼容性语法规则?
标准说什么?
从生成的汇编代码中,我看到编译器在堆栈中写入
在循环中,像普通数组一样,但我找不到任何关于标准行为的信息。
答案 0 :(得分:8)
为什么编译器接受该声明?
因为它的作者选择这样做。
默认情况下,GCC特别允许旧C编译器历史上接受的许多非标准内容。他们喜欢&#34;兼容性&#34;从那个意义上说。标准对[它]说了什么?
确切地说明了它所说的警告:ISO C ++禁止变长数组。
C ++没有VLA。
如果您看到一个被接受,那么它是一个编译器扩展;要了解编译器如何实现这样的扩展,您必须询问编译器的作者(或检查其来源,如果适用)。
答案 1 :(得分:1)
该标准要求符合标准的编译器在遇到非法内容时必须“发出诊断信息”。完成后,可以继续编译具有特定于实现的含义的代码。 (请注意,“具有特定于实现的含义”是“具有未定义行为”的礼貌形式)。