C++ 编译器中的可变长度数组 (VLA)
Variable Length Array (VLA) in C++ compilers
我们已经知道,VLA(在 C99 中标准化)不是 C++ 标准的一部分。
所以下面的代码在C++中是"illegal":
void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}
尽管如此,编译器(g++ 和 clang++)接受 代码有效语法,仅生成 warning in case -pedantic
flag is enable.
ISO C++ forbids variable length array ‘vla’ [-Wvla]
我的问题是:
为什么编译器接受该声明?
编译器不能直接拒绝长度为 [is-no-know-at-compile-time]
的数组?
是否有某种兼容性语法规则可遵循?
标准说明了什么?
从生成的汇编代码中,我看到编译器在堆栈中写入
在循环中,就像普通数组一样,但我找不到任何关于标准行为的信息。
Why does the compiler accept that declaration?
因为它的作者选择让它这样做。
GCC 特别允许,默认情况下,许多非标准的东西在历史上被旧的 C 编译器接受。从这个意义上说,他们喜欢 "compatibility"。
What does the standard say about [it]?
正如警告中所说的那样:ISO C++ 禁止可变长度数组。
C++ 没有 VLA。
你看到一个被接受的地方,它是一个编译器扩展;要了解编译器如何实现这样的扩展,您必须询问编译器的作者(或检查其源代码,如果适用)。
标准要求符合标准的编译器在遇到非法内容时必须"issue a diagnostic"。完成后,可以自由地继续编译具有特定于实现意义的代码。 (请注意 "with an implementation-specific meaning" 是 "with undefined behavior" 的礼貌形式)。
我们已经知道,VLA(在 C99 中标准化)不是 C++ 标准的一部分。
所以下面的代码在C++中是"illegal":
void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}
尽管如此,编译器(g++ 和 clang++)接受 代码有效语法,仅生成 warning in case -pedantic
flag is enable.
ISO C++ forbids variable length array ‘vla’ [-Wvla]
我的问题是:
为什么编译器接受该声明?
编译器不能直接拒绝长度为[is-no-know-at-compile-time]
的数组?
是否有某种兼容性语法规则可遵循?标准说明了什么?
从生成的汇编代码中,我看到编译器在堆栈中写入 在循环中,就像普通数组一样,但我找不到任何关于标准行为的信息。
Why does the compiler accept that declaration?
因为它的作者选择让它这样做。
GCC 特别允许,默认情况下,许多非标准的东西在历史上被旧的 C 编译器接受。从这个意义上说,他们喜欢 "compatibility"。
What does the standard say about [it]?
正如警告中所说的那样:ISO C++ 禁止可变长度数组。
C++ 没有 VLA。
你看到一个被接受的地方,它是一个编译器扩展;要了解编译器如何实现这样的扩展,您必须询问编译器的作者(或检查其源代码,如果适用)。
标准要求符合标准的编译器在遇到非法内容时必须"issue a diagnostic"。完成后,可以自由地继续编译具有特定于实现意义的代码。 (请注意 "with an implementation-specific meaning" 是 "with undefined behavior" 的礼貌形式)。