我应该信任哪个编译器?

这将是一个新手问题,但我试图在C语言(而不是C ++ )的小练习中工作,我遇到了一些问题。

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

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

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

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

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

可变长度数组( VLA )是C99function,Visual Studio 直到最近才支持C99 ,我不确定它是否目前支持最新版本的VLA。 另一方面,gcc虽然不完全支持C99。 gcc支持VLA作为C99模式之外的扩展 ,即使在C ++中也是如此

从草案C99标准第6.7.5.2数组声明者第4段

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

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

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

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

您想要的function称为可变长度数组 (VLA),并已引入C99标准。

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

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

这是一个代表您的GCC扩展 。