C 我应该信任哪个编译器?
这将是一个什么样的新手问题,但我试图用C语言(不是C++)做一个小练习,我遇到了一些问题 假设我想在一个方法中使用一个数组,其大小取决于一个参数:C 我应该信任哪个编译器?,c,arrays,visual-studio,gcc,variable-length-array,C,Arrays,Visual Studio,Gcc,Variable Length Array,这将是一个什么样的新手问题,但我试图用C语言(不是C++)做一个小练习,我遇到了一些问题 假设我想在一个方法中使用一个数组,其大小取决于一个参数: void someFunc(int arSize) { char charArray[arSize]; // DO STUFF ... } 当我尝试在Visual Studio 2013中将其编译为.c文件时,我收到一个错误,指出不允许使用非常量数组大小。然而,相同的代码在GNU编译器下的代码块中工作。我应该相信哪一个?编译
void someFunc(int arSize)
{
char charArray[arSize];
// DO STUFF
...
}
当我尝试在Visual Studio 2013中将其编译为.c
文件时,我收到一个错误,指出不允许使用非常量数组大小。然而,相同的代码在GNU编译器下的代码块中工作。我应该相信哪一个?编译器的行为如此不同,这正常吗?我一直认为,如果你正在做一些编译器不喜欢的事情,你首先不应该做,因为这不是一个标准
任何输入都是有用的!我有Python的背景,我正试图更多地参与数据结构和算法的编程
我的平台是Windows,你可能知道。在回答此问题之前,请告知我是否需要更多信息。可变长度阵列(VLA)是C99的一项功能,Visual Studio提供了该功能,我不确定它当前是否在最新版本中支持VLA。另一方面,gcc支持C99。GCC支持,即使在C++中。
从6.7.5.2节阵列声明器第4段:
[…]如果大小是整数常量表达式,且元素类型具有已知常量大小,则数组类型不是可变长度数组类型否则,数组类型为可变长度数组类型。
这取决于您的C编译器遵循的特定标准
您想要的特性被称为(VLA),并被引入到标准中
也许您的VisualStudio支持该标准的某些早期版本。也许您可以将其配置为支持更高版本
请注意,使用大尺寸的VLA可能是一个坏习惯:VLA通常是堆栈分配的,调用帧堆栈通常应该有小尺寸(在当前处理器上最多几千字节),特别是对于内核代码或递归或多线程函数。如果数组的字数超过1000个,则可能需要堆分配(例如,使用calloc
)数组。然后,您需要稍后释放它。这是一个对您起作用的过程。您应该信任您正在使用和希望支持的编译器
关于这个问题:非常量数组大小在C99中是有效的,它不完全受gcc
或MSVC(Microsoft的C/C++编译器)支持<但是,code>gcc甚至在C99模式之外也实现了标准中的这一功能,而MSVC没有。实际上没有。正如您链接的GCC文档所述,它是一个C99特性(它确实得到了GCC的支持,即使是在比C99更旧的模式下作为扩展)。在1999年ISO C标准出台之前,它是gcc的扩展;然后,它成为C语言的标准特性。(如果您使用-std=c90
编译,可以说它仍然是一个gcc扩展,但这是不确定的。)gcc也不完全支持C99。它只支持比MSVC更多的功能。@RenanGemignani正确,仍在更新中。谢谢你简洁的回复。我还遇到了一些问题,比如Visual Studio编译器告诉我不允许使用strcpy,为了安全起见,我应该尝试使用strcpy_。如果这是C99和非C99之间的部分区别,您是否有可能详细说明?另外,如果我想用旧的标准在C中做类似的操作,我会被迫声明一个任意长的数组来满足我的所有需求吗?@Bааааааааааааабаабаааааааааа;该表中的大多数“缺失”功能实际上不是必需的。它不再是一个真正的扩展。gcc完全支持c99可变长度数组
请参见注意,使用超大VLA可能是一个坏习惯
使用超大VLA的程序会崩溃。