C ++用于定义数组大小的变量表达式?

时间:2013-09-20 00:33:20

标签: c++ arrays visual-studio-2012

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

int var = function(a);

int num [var];

此代码在网站上运行良好,但在Visual Studio Express 2012上,它给出了一个错误:

C2057:预期的常数表达

这是Visual Studio的问题吗?我已经读过这是一个C ++规则,但为什么它在网站上有效?感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:3)

代码段所需的功能称为variable length arrays(VLA)。 C或C ++语言对此功能的支持取决于编译器和标准版本。

  • C99支持VLA作为标准。
  • 早于C99的版本(包括C90)不支持VLA作为标准,但某些编译器可能会将其作为语言扩展实现。
  • C11使VLA成为可选功能。
  • C ++ 14支持称为动态数组的受限制变体。
  • 早于C ++ 14的版本(包括C ++ 11,C ++ 03和C ++ 98)不支持VLA作为标准,但某些编译器可能会将其作为扩展实现。

特别是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);