为什么我可以在gcc上声明一个预定大小的数组,但不能在visual studio c ++上声明?

时间:2014-02-19 12:46:53

标签: c visual-studio-2012 gcc

我想知道为什么我可以在linux中执行此代码而不是在visual studio上执行此代码? (文件 - > main.c)

int size;
printf("Size:");
scanf("%d",&size);
int vec[size];

是否与c89或c99标准有关?因为我试图更改gcc上的标志,但仍然有效。

2 个答案:

答案 0 :(得分:6)

Variable length arrays VLA )是标准的C99补充,until recently Visual Studio不支持C99,据我所知不支持VLA。如果你在C99模式之外的gcc中构建它,让我们说在c90模式并使用-pedantic标志,它将提供警告:

  

警告:ISO C90禁止变长数组'vec'[-Wvla]

gcc将支持VLA as an extension outside of C99 mode,甚至支持C ++。

请注意, C11 使VLA成为可选项,我们可以从草案C11标准部分6.10.8.3 条件功能宏中看到,其中包括以下项目:

  

_ _STDC_NO_VLA_ _ 整数常量 1 ,旨在表明   实现不支持可变长度数组或可变   修改后的类型。

答案 1 :(得分:1)

  

是否与c89或c99标准有关?

YES!
MSVC不支持C99。可变长度数组是C99功能。

GCC还允许VLA as an extension,因此,您可以在C90模式下编译代码。

6.19可变长度阵列

  

ISO C99允许使用可变长度自动数组,作为扩展GCC在C90模式和C ++ 中接受它们。