正如我们已经知道的那样,VLA(在C99中标准化)不是C++标准的一部分,所以下面的代码在C++中是"非法"的:
尽管编译器(g++和clang++)接受该代码作为有效的语法,但只有在启用-pedantic标志时才会产生警告。
ISO C++禁止变长数组'vla'[-Wvla]
我的问题是:
1. 为什么编译器接受这个声明? 编译器不能拒绝长度在编译时未知的数组吗? 是否有一种兼容性语法规则需要遵循?
2. 标准对此有何规定? 从生成的汇编代码中可以看到,编译器在循环中像普通数组一样写入堆栈,但我找不到关于标准行为的任何信息。
void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}
尽管编译器(g++和clang++)接受该代码作为有效的语法,但只有在启用-pedantic标志时才会产生警告。
ISO C++禁止变长数组'vla'[-Wvla]
我的问题是:
1. 为什么编译器接受这个声明? 编译器不能拒绝长度在编译时未知的数组吗? 是否有一种兼容性语法规则需要遵循?
2. 标准对此有何规定? 从生成的汇编代码中可以看到,编译器在循环中像普通数组一样写入堆栈,但我找不到关于标准行为的任何信息。
-std=c++20
(默认为-std=gnu++20
)和-pedantic
。 - Jesper Juhl