0

当我使用 GCC 编译器时,我可以使用函数输入参数在函数中动态分配数组大小,但是当我使用 Windows cl.exe 编译器编译它时同样失败。为什么。?

void func1(int array_ele)
{
    int arr[array_ele];
    for (int i=0; i<array_ele; i++)
        arr[i] = i;
    /* Rest of the code */
}

int main(int argc, char* argv[])
{
    int a = 10;
    func1(a);
    /* Rest of the code */
}
4

3 回答 3

3

可变长度数组是在 C99 标准中引入的,微软 C 编译器直到最近才支持 C99,即使在最新的 2015 版本中它的支持仍然不完整(例如它仍然不支持 VLA)。

版本 5 之前的 GCC 默认使用“gnu90”作为 C 方言来使用,这是 C89 标准的更新版本,带有 GCC 扩展,其中一个扩展是 VLA。从版本 5 和更高版本开始,默认值为“gnu11”,它是带有 GCC 扩展的最新 C11 标准。

于 2016-04-13T05:43:02.370 回答
3

int arr[array_ele];是一个变长数组声明。它是标准 C(自 C99 起)。然而,cl.exe它不是一个符合标准的 C 编译器,微软基本上已经声明他们不打算生产一个符合标准的 C 编译器(人们可能会假设有恶意并说他们不想帮助编写可移植代码),而是专注于关于实现 C++ 功能。更多关于 Visual Studio 对 C 标准的支持的讨论,请参见Visual Studio support for new C/C++ Standards?

VS2015 支持(时不时过时的)C99 的一些特性(包括库支持和块内任何位置的变量声明等);并实现了一些标准库函数:C++11/14/17 Features In VS 2015 RTM说:

Visual Studio 2015 完全实现了 C99 标准库,但依赖于 Visual C++ 编译器尚不支持的编译器功能的任何库功能除外(例如,<tgmath.h>未实现)。

然而,据我所知,C99 的大部分 - 更不用说 C11 - 编译器功能仍未实现。

于 2016-04-13T05:43:35.993 回答
2
int arr[array_ele];

在 C99 及更高版本中受支持。这称为可变长度数组。gcc支持它。Microsoft Visual Studio 编译器似乎不支持它。请参阅https://msdn.microsoft.com/en-us/library/zb1574zs.aspx

于 2016-04-13T05:42:51.853 回答