函数调用中数组分配的差异(gcc 和 cl.exe)
Difference in array allocation in function call (gcc and cl.exe)
当我使用 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 */
}
int arr[array_ele];
C99 及更高版本支持。这称为可变长度数组。 gcc
支持。 Microsoft Visual Studio 编译器似乎不支持它。参见 https://msdn.microsoft.com/en-us/library/zb1574zs.aspx。
Variable-length arrays是在C99标准中引入的,微软的C编译器直到最近才支持C99,即使是最新的2015版也支持不完整(比如还是不支持支持 VLA)。
版本 5 之前的 GCC 默认使用 "gnu90" 作为 C 方言使用,这是 C89 标准的更新版本,带有 GCC 扩展,其中一个扩展是 VLAs。从版本 5 及更高版本开始,默认值为 "gnu11",这是带有 GCC 扩展的最新 C11 标准。
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 fully implements the C99 Standard Library, with the exception of any library features that depend on compiler features not yet supported by the Visual C++ compiler (for example, <tgmath.h>
is not implemented).
然而,据我所知,C99 的大部分 - 更不用说 C11 - 编译器功能仍未实现。
当我使用 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 */
}
int arr[array_ele];
C99 及更高版本支持。这称为可变长度数组。 gcc
支持。 Microsoft Visual Studio 编译器似乎不支持它。参见 https://msdn.microsoft.com/en-us/library/zb1574zs.aspx。
Variable-length arrays是在C99标准中引入的,微软的C编译器直到最近才支持C99,即使是最新的2015版也支持不完整(比如还是不支持支持 VLA)。
版本 5 之前的 GCC 默认使用 "gnu90" 作为 C 方言使用,这是 C89 标准的更新版本,带有 GCC 扩展,其中一个扩展是 VLAs。从版本 5 及更高版本开始,默认值为 "gnu11",这是带有 GCC 扩展的最新 C11 标准。
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 fully implements the C99 Standard Library, with the exception of any library features that depend on compiler features not yet supported by the Visual C++ compiler (for example,
<tgmath.h>
is not implemented).
然而,据我所知,C99 的大部分 - 更不用说 C11 - 编译器功能仍未实现。