函数调用中数组分配的差异(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++ 编译器尚不支持的编译器功能的任何库功能除外(例如,
<tgmath.h>
未实现)。 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 的预处理和编译之间插入一个步骤?