【发布时间】:2012-12-14 01:18:17
【问题描述】:
我有一些关于 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++ 中都被禁止?是什么原因导致数组进入全局和局部范围的行为不同?
【问题讨论】:
-
假设允许全局 VLA。它们的(可变)大小何时实际定义?
-
@cnicutar 好吧......就像所有的 VLA,在执行时间上,就像其他范围一样。我知道这不是答案,但我想知道为什么。
-
是的,所以一个全局 VLA,你怎么知道值是什么时候定义的?为了使它有意义,它要求您可以在构建数组之前设置大小的值 - 并且需要在编译时知道大小以告诉系统操作系统在加载可执行文件时需要多少空间.
-
投票重新打开,因为这不是链接的“重复”的重复。链接的问题询问如何避免文件范围内不允许 VLA 的错误;这个问题询问为什么文件范围内不允许使用 VLA。
标签: c++ c arrays variable-length-array