崇高文本 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解释。
我最近更改了我的 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解释。