为什么在某些编译器中可以声明像int myarr [noconstant]这样的数组;而不是别人? [重复]

问题描述 投票:0回答:1
我见过在GCC和Clang中有效的代码,例如:

size_t size; cin >> size; int arr[size];

工作。但是当然这不是可能的,因为它不是常量表达式。那么,为什么呢?如果我们这样做,编译器会占用动态内存并自动为我们释放它吗?(顺便说一句,这在Visual C ++中无效)
c++ dynamic-memory-allocation
1个回答
2
投票
这就是所谓的Variable-length array。它不是C ++的一部分,但是某些编译器(例如GCC和Clang)将其作为扩展支持。这就是为什么它在那些编译器上可以正常编译的原因,但是它不是合法的C ++。在GCC上,您可以使用以下编译器标志禁用VLA:

-Werror=vla

根据GCC documentation

可变长度自动数组在ISO C99中是允许的,并且作为扩展GCC在C90模式和C ++中接受它们。这些数组是与其他任何自动数组一样声明,但长度为不是常量表达式存储在以下位置分配当包含声明退出。例如:

FILE * concat_fopen (char *s1, char *s2, char *mode) { char str[strlen (s1) + strlen (s2) + 1]; strcpy (str, s1); strcat (str, s2); return fopen (str, mode); }

© www.soinside.com 2019 - 2024. All rights reserved.