为什么“只能使用常量来声明自动和静态数组的大小”?

时间:2012-03-31 18:11:20

标签: c++ c

  

只能使用常量来声明自动和静态的大小   阵列。为此目的不使用常量是编译错误。

皮尔森说。

但是,以下工作正常。根据皮尔森的说法,它应该不起作用(我认为)。你能帮我理解一下吗?

#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++;
    }
}

3 个答案:

答案 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 ++标准。