【问题标题】:Variable Length array forbidden in ISO C++ error in sublime text 3崇高文本3中的ISO C++错误中禁止可变长度数组
【发布时间】:2020-04-22 14:15:32
【问题描述】:

我最近更改了我的 C++ 编译器,我遇到了一个奇怪的错误,上面写着 ISO C++ 禁止可变长度数组。 我清楚地记得我以前的编译器没有遇到这个错误。这是我编写的代码 sn-p,只是为了检查这个新编译器的可靠性。

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}


In function 'int main()':
test.cpp:8:9: error: ISO C++ forbids variable length array 'a' [-Wvla]
int a[n]={0};

您会看到,即使用户在“n”中输入,编译器也会声明该数组的长度是可变的。 也欢迎对其他编译器版本提出建议!

【问题讨论】:

  • 这正是错误所说的。标准 C++ 禁止在编译时长度未知的数组。一些编译器具有允许 VLA 的扩展,但它们通常不是一个好主意。
  • Variable-length arrays 不是 C++ 的一部分。一些编译器可能会将其添加为非标准扩展。请改用std::vector

标签: c++ c++11 gcc c++14 iso


【解决方案1】:

将 VLA 替换为 std::vector:

#include <iostream>
#include <vector>

int main()
{
    int n;
    std::cin>>n;
    std::vector<int> a(n);  // was VLA: int a[n];
    for(int i=0;i<n;i++)
        std::cin>>a[i];
    for(int i=0;i<n;i++)
        std::cout<<a[i]<<" ";
}
【解决方案2】:

代码在标准 C++ 中无效。根据 C++ 标准,数组大小必须是常量表达式。 C++ 中不允许使用可变长度数组,因为 C++ 为此提供了 std::vector。 C 标准允许 VLA(可变长度数组),而 C++ 不允许。

【讨论】:

    【解决方案3】:

    您的新编译器是正确的:标准C++不允许使用可变长度数组! (GNU g++ 允许它们作为扩展)。见这里:Why aren't variable-length arrays part of the C++ standard?

    您应该修改您的代码以使用 std::vector 类型,而不是:

    #include <iostream>
    #include <vector> // Definitions for the std::vector types
    //using namespace std; // This can cause problems - better only "using" specifics:
    using std::cin;
    using std::cout;
    
    int main()
    {
        size_t n; // You CAN use "int" but "size_t" is more accurate here
        cin >> n;
    //  int a[n]; // Forbidden in standard C++
        std::vector<int> a(n); // Declare "a" as a vector with "n" elements
        for (size_t i = 0; i < n; i++)
            cin >> a[i]; // You can still use the "[i]" syntax to access the elements
        for (size_t i = 0; i < n; i++)
            cout << a[i] << " ";
        return 0;
    }
    

    请随时要求进一步澄清和/或解释。

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多