1

我是 C++ 的新手,我在学校的计算机上练习编码,所以我必须使用在线编译器 (www.CompileOnline.com)。我有一个由函数定义的变量,然后用于初始化数组,如下所示:

int var = 函数(a);

整数 [var];

这段代码在网站上运行得很好,但在 Visual Studio Express 2012 上它给了我一个错误:

C2057:预期的常量表达式

这是 Visual Studio 的问题吗?我读过这是 C++ 规则,但为什么它在网站上有效?任何帮助表示赞赏,谢谢。

4

3 回答 3

4

代码片段所需的功能称为可变长度数组(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;
    // ...
}
于 2013-09-20T00:43:50.047 回答
1

C++ 中不允许使用可变长度数组。数组的大小必须在编译时确定。

CompileOnline.com 说它使用 GNU GCC 4.7.2 版。GCC 有一个扩展,它支持C++ 中的可变长度数组:

ISO C99 允许可变长度自动数组,作为扩展,GCC 在 C90 模式和 C++ 中接受它们。

于 2013-09-20T00:40:24.267 回答
1

似乎在线编译器是gcc,它实现了可变长度数组作为 C++ 中的扩展。这种情况下的“问题”实际上是 gcc,而不是 VC++:gcc 实现了一个默认启用的扩展,诱使用户创建不可移植的代码。

如果您需要 C++ 中的可变大小数组,您将包含<vector>并使用在此标头中声明的类模板,例如:

int var = function(a);
std::vector<int> num(var);
于 2013-09-20T00:40:38.783 回答