我有一些关于VLA及其行为的概念需要澄清。
自 C99 以来的 AFIK 可以将 VLA 声明为本地范围:
int main(int argc, char **argv)
{
// function 'main' scope
int size = 100;
int array[size];
return 0;
}
但在全局范围内是禁止的:
const int global_size = 100;
int global_array[global_size]; // forbidden in C99, allowed in C++
int main(int argc, char **argv)
{
int local_size = 100;
int local_array[local_size];
return 0;
}
上面的代码在 C99 中声明了一个 VLA,因为const
修饰符不会创建编译时值。在 C++global_size
中是编译时值,因此global_array
不会成为 VLA。
我需要知道的是:我的推理是否正确?我描述的行为是否正确?
我也想知道:为什么不允许全局范围内的 VLA?在 C 和 C++ 中都被禁止?数组进入全局和局部范围的行为不同的原因是什么?