不,等等,忍受我......
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吗?
答案 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的官方部分。
(当然,我只是在玩一个编译器。所以带上一点点盐。)