代码片段所需的功能称为可变长度数组(VLA)。C 或 C++ 语言对此功能的支持取决于编译器和标准的版本。
- C99 标准支持 VLA。
- C99 之前的版本(包括 C90)不支持 VLA 作为标准,但一些编译器可能将其作为语言扩展来实现。
- C11 使 VLA 成为可选功能。
- C++14 支持称为动态数组的 VLA 的受限变体。
- C++14 之前的版本(包括 C++11、C++03 和 C++98)不支持 VLA 作为标准,但一些编译器可能将其作为扩展实现。
特别是,GCC 将 VLA 实现为 C90 和 C++ 的语言扩展,并且显然 www.compileonline.com 使用 GCC 作为编译器(撰写本文时版本为 4.7.2)。没有任何版本的 Visual C++ 编译器实现 VLA。
Herb Sutter 谈到 C++14 的动态数组特性:
在该语言中,草案 C++14 现在允许基于堆栈的数组在运行时确定大小:
void f(std::size_t n)
{
int a[n];
...
}
请注意,这与 C99 可变长度数组 (VLA) 不同,并且 C11 标准已使 VLA 有条件地支持,因此它们不再是符合 C 编译器所需的可移植 C 的一部分。特别是,C++ 明确不支持 C99 VLA 中的以下 C++ 认为不可取的特性:
- 多维数组,除了顶层之外还有运行时限制(类似地,新表达式的数组形式也不支持)
- 对函数声明符语法的修改
sizeof(a)
是一个运行时评估的表达式,返回大小a
typedef int a[n];
评估n
并通过 typedef
如果您想要在几乎任何版本的 C++ 中工作的 C++ 代码,请考虑std::vector
改用:
#include <vector>
int main()
{
int var = function(a); // Assume function() has been defined.
std::vector<int> num(var); // Creates a vector with var number of elements.
// ...
int num1 = num[1]; // You can access elements in vectors just like arrays.
num[1] += 10;
// ...
}