我是C ++的新手,我在学校的计算机上练习编码,所以我必须使用在线编译器(www.CompileOnline.com)。我有一个由函数定义的变量,然后用于初始化数组,如下所示:
int var = function(a);
int num [var];
此代码在网站上运行良好,但在Visual Studio Express 2012上,它给出了一个错误:
C2057:预期的常数表达
这是Visual Studio的问题吗?我已经读过这是一个C ++规则,但为什么它在网站上有效?感谢任何帮助。谢谢。
答案 0 :(得分:3)
代码段所需的功能称为variable length arrays(VLA)。 C或C ++语言对此功能的支持取决于编译器和标准版本。
特别是GCC implements VLAs as a language extension for C90 and C++,显然www.compileonline.com使用GCC作为编译器(截至本文撰写时版本为4.7.2)。没有版本的Visual C ++编译器实现VLA。
Herb Sutter talks about C++14's dynamic array feature:
在该语言中,草案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;
// ...
}
答案 1 :(得分:1)
C ++中不允许使用可变长度数组。数组的大小必须在编译时可以确定。
CompileOnline.com称它使用GNU GCC 4.7.2版。 GCC有一个扩展,支持C ++中的variable length arrays:
ISO C99允许使用可变长度自动数组,作为扩展,GCC在C90模式和C ++中接受它们。
答案 2 :(得分:1)
似乎在线编译器是gcc,它将可变长度数组实现为C ++中的扩展。 &#34;问题&#34;在这种情况下实际上是gcc,而不是VC ++:gcc实现了一个扩展,它默认启用,诱使用户创建不可移植的代码。
如果你需要在C ++中使用可变大小的数组,你可以包含<vector>
并使用此标题中声明的类模板,例如:
int var = function(a);
std::vector<int> num(var);