崇高文本 3 中的 ISO C++ 错误禁止可变长度数组

Variable Length array forbidden in ISO C++ error in sublime text 3

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

#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' 中进行输入,编译器也会声明数组的长度可变。 也欢迎对其他编译器版本提出建议!

将 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]<<" ";
}

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

您的新编译器是正确的:可变长度数组在标准 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;
}

随时要求进一步澄清and/or解释。