【发布时间】:2014-02-19 12:46:52
【问题描述】:
我想知道为什么我可以在 linux 中执行此代码,但不能在 Visual Studio 中执行此代码? (文件-> main.c)
int size;
printf("Size:");
scanf("%d",&size);
int vec[size];
它与c89或c99标准有什么关系吗?因为我尝试更改 gcc 上的标志,但仍然有效。
【问题讨论】:
标签: c visual-studio-2012 gcc
我想知道为什么我可以在 linux 中执行此代码,但不能在 Visual Studio 中执行此代码? (文件-> main.c)
int size;
printf("Size:");
scanf("%d",&size);
int vec[size];
它与c89或c99标准有什么关系吗?因为我尝试更改 gcc 上的标志,但仍然有效。
【问题讨论】:
标签: c visual-studio-2012 gcc
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,用于表示 实现不支持可变长度数组或可变 修改类型。
【讨论】:
和c89还是c99标准有关系吗?
是的!
MSVC 不支持 C99。可变长度数组是 C99 特性。
GCC 也允许VLA as an extension,因此,您可以在 C90 模式下编译您的代码。
在 ISO C99 中允许使用可变长度自动数组,作为扩展,GCC 在 C90 模式和 C++ 中接受它们。
【讨论】:
C89 forbids variable length array 'vec' [-Wvla]。这可能是编译器扩展。
-pedantic 来获取警告,因为 gcc 支持 VLA 作为扩展。