只能使用常量来声明自动和静态的大小 阵列。为此目的不使用常量是编译错误。
皮尔森说。
但是,以下工作正常。根据皮尔森的说法,它应该不起作用(我认为)。你能帮我理解一下吗?
#include <iostream>
using namespace std;
int main()
{
int in;
cin >> in;
int a[in];
a[4] = 412;
int i = 0;
while(i<5){
cout << i << ":" << a[i] << endl;
i++;
}
}
答案 0 :(得分:6)
这是在GNU编译器中找到的C ++的扩展,但它不符合C ++标准。如果使用g++ -std=c++98
编译代码,编译器应该抱怨。
答案 1 :(得分:2)
如果您使用的是C ++编译器,那么它可以正常工作,因为大多数C ++编译器都提供了支持 Variable Length arguments(VLA) 的编译器扩展。
如果您使用的是C编译器,那么它可以工作,因为标准允许它。
在C ++中,C ++标准不允许使用VLA,因此通过编译器扩展对它的任何使用都会使您的代码无法移植。 C ++提供 std::vector 或 std :: array (C ++ 11),它们使用可变长度数组或c样式数组resp满足所有要求,你应该使用它们。
请注意,自C99标准以来,C中允许使用VLA。
始终通过在GCC中选择标准来编译代码,使用其中一个选项-ansi
,-std=c90
或-std=iso9899:1990
,-std=c++03
,-std=c++0x
;获得标准所要求的所有诊断
您还应指定-pedantic
(或-pedantic-errors
,如果您希望它们是错误而非警告)
答案 2 :(得分:0)
这些被称为可变长度数组。可变长度数组仅在C中受支持且仅在C99标准之后。根据任何标准,可变长度数组不是C ++的一部分。
因此,如果这为您编译,您要么使用C99及以上,要么正如@Philipp所说,C ++的扩展名使您的代码不可移植且不符合任何C ++标准。