C++可以用变量定义数组了么

2017-10-23 11:07:04 +08:00
 dekira

偶然发现 c++可以用变量定义数组了... 这是为啥?新的标准么?求解答

Clion,Ubuntu,支持 c++11,其他见图吧!......然而不能发图!

3650 次点击
所在节点    C
32 条回复
missdeer
2017-10-23 11:08:46 +08:00
然而图呢?
GeruzoniAnsasu
2017-10-23 11:10:53 +08:00
dekira
2017-10-23 11:14:00 +08:00
图来了......

sagaxu
2017-10-23 11:14:43 +08:00
18 年前 C 语言就可以这么做了,但是 C++一直没有支持 VLA,因为 C++有 vector 和 array
mainjzb
2017-10-23 11:16:59 +08:00
C99 早就支持了
araraloren
2017-10-23 11:17:08 +08:00
c++ 就一直没支持过
c 有一个标准必选支持,最新的标准已经变成可选的了
coordinate
2017-10-23 11:18:59 +08:00
C99 中数组大小运行时刻确定,另外可变长数组的维数在数组生存期内是不变的。
wevsty
2017-10-23 11:20:30 +08:00
对 C 来说,C99 允许定义变长数组,然而有些编译器一直不肯支持(没错,说的就是你 MSVC )。
对 CPP 来说,变长数组这个特性标准上就没有支持,而且更 cpp 的做法是使用 vector 这样的 STL 容器。
northisland
2017-10-23 11:23:05 +08:00
编译器的问题。记得很久以前折腾 codeblocks 可以通过,msvc 不行。

比较恶心的问题,最好不用
nullcoder
2017-10-23 11:24:12 +08:00
@wevsty 变长数组和变量定义数组长度不是一个意思吧
baixiangcpp
2017-10-23 11:34:56 +08:00
wevsty
2017-10-23 11:35:29 +08:00
@nullcoder
不用太纠结字面的说法。
变长数组通常用来指代的是能直接用变量来定义数组的这种特性。
malloc 或者 new 出来的一个空间也可以当成数组用,这样也确实实现了变量来定义数组这种事实。
一定要纠结的话,可以理解为变长数组是用变量定义数组长度的一个子集。
justou
2017-10-23 11:40:23 +08:00
编译期常量定义数组大小(c++11)
constexpr int a = 10;
int b[2 * a] = { 0 };

C99 标准开始似乎才有这种变长数组写法
void f(size_t a){
int arr[a];
...
}
因为是分配在栈上的, 所以用得不对直接炸栈
soli
2017-10-23 11:45:13 +08:00
C99 已经支持了。
C++98 和 C++11 的时候,gcc 是以扩展的形式支持的;
本来有望在 C++14 标准中支持,但讨论了半天,最后还是被砍掉了
( gcc 都脱了裤子上了,C++14 正式出来之后又把裤子穿上了)。

所以,现在 gcc 还是以扩展的形式支持,就和 C++98、C++11 的时候一样。

## GCC 4.9 的发布说明

> G++ supports C++1y variable length arrays. G++ has supported GNU/C99-style VLAs for a long time, but now additionally supports initializers and lambda capture by reference. In C++1y mode G++ will complain about VLA uses that are not permitted by the draft standard, such as forming a pointer to VLA type or applying sizeof to a VLA variable. Note that it now appears that VLAs will not be part of C++14, but will be part of a separate document and then perhaps C++17.


## GCC 5 的发布说明

> G++ no longer supports N3639 variable length arrays, as they were removed from the C++14 working paper prior to ratification. GNU VLAs are still supported, so VLA support is now the same in C++14 mode as in C++98 and C++11 modes.

## 上面提到的 N3639

[N3639]( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3639.html)
chiu
2017-10-23 11:45:52 +08:00
C99 就支持了
lrxiao
2017-10-23 11:49:56 +08:00
VLA 有 security 问题。。C11 已经是 optional 了。。标准只存在于 C99 C++根本没支持过..
liuminghao233
2017-10-23 13:13:24 +08:00
这样定义并不是数组 而是指针吧
introom
2017-10-23 13:17:26 +08:00
你开 Wall Wextra pedantic ,总会告诉你哪里有问题吧
luoqeng
2017-10-23 13:27:32 +08:00
叫柔性数组吧
allinwonder
2017-10-23 15:02:38 +08:00
C++ 的标准真是越来越庞大而臃肿,简直离人类能用越来越远了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/399860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX