C和C++中的可变长度数组(VLA)

Pap*_*ter 8 c c++ arrays variable-length-array

可能重复:
文件范围内可变修改的数组

我有一些关于VLA及其行为的概念,我需要澄清一下.

自C99起AFIK可以将VLA声明为本地范围:

int main(int argc, char **argv)
{
    // function 'main' scope
    int size = 100;
    int array[size];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它在全球范围内被禁止:

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在C99中声明了一个VLA,因为const修饰符不会创建编译时值.在C++中global_size是一个编译时值,因此,global_array不会成为VLA.

我需要知道的是:我的推理是否正确?我描述的行为是正确的吗?

我也想知道:为什么不允许全球范围内的VLA?在C和C++中是否被禁止?数组在全局和局部范围内的行为有什么不同?

Joh*_*ode 5

C++不支持VLA,期间.第二个代码片段在C++中工作的原因是该const关键字在C++中创建了一个编译时常量; 在C中,它没有.

无论您如何声明大小变量,C99都不支持块范围,句点之外的VLA.请注意,C2011使VLA支持可选.


Jen*_*edt 5

是的,你的推理是正确的,这就是C和C++如何查看这些不同形式的数组声明和定义.

正如其他人已经说过的那样,const在全球范围内具有真正可变长度(非)的VLA 很难理解.评估顺序是什么,例如,如果长度表达式将引用不同编译单元的对象?C++没有VLA,但它在文件范围内对对象进行动态初始化.如果您不得不依赖评估订单,那么这已经让您感到非常痛苦.

这为C留下了关于包含const限定对象的长度表达式的小间隙,这是不允许的.这是因为C标准不将这些对象视为"整数常量表达式".这可能会在未来的版本中发生变化,但到目前为止,C委员会并没有发现有必要允许这样的事情:有一些enum常数在C中发挥作用.他们唯一的限制是它们仅限int于C,拥有它们会很高兴size_t.

  • 终于有人证明已经阅读了整个问题!(为此+1)恕我直言,这个问题不是[重复](http://stackoverflow.com/questions/1712592/variously-modified-array-at-file-scope),因为我专注于其他事实。感谢您的解释并感谢您回答了我几乎所有的问题。 (2认同)