我们已经知道,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/