我应该信任哪个编译器?

时间:2013-08-29 21:39:00

标签: c arrays visual-studio gcc variable-length-array

这将是一些新手问题,但我正在尝试使用 C 语言(而不是 C ++ )进行小练习,而我正在运行陷入一些问题。

假设我想在一个方法中使用一个数组,该方法的大小取决于其中一个参数:

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}

当我尝试在 Visual Studio 2013 中将其编译为.c文件时,我收到一条错误消息,指出不允许使用非常量数组。但是,相同的代码在GNU编译器下的 CodeBlocks 中工作。我应该相信哪一个?编译器的行为是否正常?我一直认为,如果你正在做一些编译器不喜欢的事情,你不应该首先这样做,因为它不是标准。

任何输入都很有用!我来自 Python 中的背景,我试图更多地参与数据结构和算法的编程。

我可以说,我的平台是Windows。如果这个问题需要更多信息才能回答,请告诉我。

4 个答案:

答案 0 :(得分:9)

可变长度数组( VLA )是 C99 功能,Visual Studio until recently执行not support C99,我不确定它是否支持VLA在最新版本中。另一方面,gcc确实支持C99 not fully。 gcc支持VLA as an extension outside of C99 mode,即使在 C ++

来自draft C99 standard部分6.7.5.2 数组声明者第4段

  

[...]如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。

答案 1 :(得分:3)

这取决于您的C编译器遵循的特定标准。

您想要的功能称为variable length array(VLA),并已引入C99标准。

也许您的Visual Studio支持该标准的某些早期版本。也许您可以将其配置为支持更高版本。

请注意,使用大尺寸的VLA可能是一个坏习惯:VLA通常是堆栈分配的,并且调用帧堆栈通常应该具有较小的大小(当前处理器上最多几千字节),特别是对于内核代码或用于递归或多线程函数。如果数组有超过一千个单词,您可能希望对数组进行堆分配(例如,使用calloc)。那么你以后需要free

答案 2 :(得分:3)

您应该信任您正在使用且想要支持的编译器。

在该特定问题上:非常量数组大小在C99中有效,gcc或MSVC(Microsoft的C / C ++编译器)都不完全支持。但是,gcc具有此功能,即使在C99模式之外也可以实现,而MSVC则没有。

答案 3 :(得分:0)

这是GCC extension对你的行为。