函数调用中数组分配的差异(gcc和cl.exe)

Posted

技术标签:

【中文标题】函数调用中数组分配的差异(gcc和cl.exe)【英文标题】:Difference in array allocation in function call (gcc and cl.exe) 【发布时间】:2016-04-13 05:39:56 【问题描述】:

当我使用 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 */

【问题讨论】:

@arrowd:不,这是因为 VS 没有实现 C99 (VLA)。 我会说 VS 没有 C 编译器。 【参考方案1】:

Variable-length arrays 是在 C99 标准中引入的,Microsoft C 编译器直到最近才支持 C99,即使在最新的 2015 版本中它的支持仍然不完整(例如它仍然不支持 VLA)。

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

【讨论】:

【参考方案2】:

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++ 编译器尚不支持的编译器功能的任何库功能除外(例如,&lt;tgmath.h&gt; 未实现)。 em>

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

【讨论】:

您注意到实现了C99标准库支持C99标准意味着不同吗?我想是的。 @tofro 是的,我将部分引文用斜体表示,但我什至找不到任何关于 VS2015 实际支持的什么 C99 编译器功能的明确信息。【参考方案3】:
int arr[array_ele];

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

【讨论】:

以上是关于函数调用中数组分配的差异(gcc和cl.exe)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 GCC 或 cl.exe 的预处理和编译之间插入一个步骤?

C语言如何给指针分配内存?

GCC 生成的程序集 - C 函数调用时的段错误

为啥这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次

CMake:生成调用 cl.exe 的批处理文件

c语言中数组名作为函数参数