【问题标题】:Why can i declare an array with a predestined size on gcc but not on visual studio c++?为什么我可以在 gcc 上声明一个具有预定大小的数组,而不是在 Visual Studio C++ 上?
【发布时间】: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


    【解决方案1】:

    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,用于表示 实现不支持可变长度数组或可变 修改类型。

    【讨论】:

      【解决方案2】:

      和c89还是c99标准有关系吗?

      是的!
      MSVC 不支持 C99。可变长度数组是 C99 特性。

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

      6.19 可变长度数组

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

      【讨论】:

      • 您使用的是哪个版本的 GCC?最新版本是 4.8.2,您的代码正在编译并带有警告 C89 forbids variable length array 'vec' [-Wvla]。这可能是编译器扩展。
      • @Vcoder 您需要使用-pedantic 来获取警告,因为 gcc 支持 VLA 作为扩展。
      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2015-12-01
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多