C ++是否支持可变长度数组?

时间:2011-12-21 17:12:32

标签: c++ c++11 variable-length-array

不,等等,忍受我......

VLA一直是GCC扩展,但它们被C99采用:

  

[C99: 6.7.5.2/4]:如果大小不存在,则数组类型为   不完全类型。如果大小是*而不是表达式,那么   数组类型是一个未指定大小的可变长度数组类型   只能在具有函数原型范围的声明中使用;这样   尽管如此,数组仍然是完整类型。 如果大小是整数   常量表达式和元素类型具有已知的常量大小   数组类型不是可变长度数组类型; 否则,   数组类型是可变长度数组类型。

C99也称为ISO/IEC 9899:1999

现在:

  

[C++11: 1.1/2]: C ++是一种基于通用编程语言   关于ISO / IEC 9899:1999中规定的C编程语言   (以下简称C标准)。除了   C,C ++提供的工具提供其他数据类型,类,   模板,异常,命名空间,运算符重载,函数名称   重载,引用,免费商店管理运营商,以及   额外的图书馆设施。

那么C ++ 11也不应该有VLA吗?

4 个答案:

答案 0 :(得分:15)

这种余地措辞并不意味着C99中的任何内容都在C ++ 11中。你引用的只是介绍性文字。

答案 1 :(得分:13)

这个C99功能被C ++自己的语义有效地重写,可以是任何其他“继承”的功能:

  

[C++11: 8.3.4/1]:在T D声明中,其中D的格式为

     
    

D1 [常量表达式 opt ] attribute-specifier-seq opt

  
     

[..]

这是我们在C ++中给出的唯一数组声明语法。

请注意,“与C兼容”条款C.1中未提及此差异。

答案 2 :(得分:8)

对于两种语言,constant-expression的定义是不同的。

const size_t size = 5;
int array[size]; // array in C++, VLA in C

答案 3 :(得分:2)

这为我编译:( g ++ 4.6 with -std=c++0x)。但它不能用-pedantic编译(感谢@MarkB)。相反,它警告“ template.cpp:7:12:警告:ISO C ++禁止变长数组'n'[-Wvla]

int main(int argc, char ** argv) {
    int n[argc];
}

因此编译器在编译时无法知道n的大小。 这是C ++的GNU扩展吗?这似乎是一个GNU扩展,而且VGA不是C ++ 11的官方部分。

(当然,我只是在玩一个编译器。所以带上一点点盐。)