C ++是否支持可变长度数组?
不,等等,跟我一起…
VLA总是一个GCC扩展,但是它们被C99采用:
[C99: 6.7.5.2/4]:
如果大小不存在,则数组types是不完整的types。 如果size的大小是*,而不是一个expression式,则数组types是一个非指定大小的可变长度的数组types,它只能在具有函数原型作用域的声明中使用; 这样的数组仍然是完整的types。 如果大小是一个整数常量expression式,并且元素types具有已知的常量大小,则数组types不是可变长度数组types; 否则,数组types是一个可变长度的数组types。
C99也被称为ISO/IEC 9899:1999
。
现在:
[C++11: 1.1/2]:
C ++是一种基于ISO / IEC 9899:1999(以下简称C标准)规定的C编程语言的通用编程语言。 除了C提供的function之外,C ++还提供额外的数据types,类,模板,exception,命名空间,运算符重载,函数名称重载,引用,免费商店pipe理操作员以及其他库设施。
那么C ++ 11也不应该有VLA吗?
这种宽松的措辞并不意味着C99中的任何和所有东西都在C ++ 11中。 你所引用的只是介绍性文字。
这个C99特性被 C ++自己的语义所覆盖 ,就像任何其他的“inheritance”特性一样:
[C++11: 8.3.4/1]
:在D
有forms的声明TD
D1
[ 常量expression式opt ] 属性 – 说明符 – select[..]
这是我们在C ++中唯一的数组声明语法。
请注意,在“与C的兼容性”第C.1
中没有提到这种差别。
常量expression式的定义对于两种语言是不同的。
const size_t size = 5; int array[size]; // array in C++, VLA in C
这为我编译:(g ++ 4.6与-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扩展,并且VLA不是C ++ 11的官方部分。
(当然,我只是在玩一个编译器,所以拿一点盐来吧。)