我看到这样的一些代码:
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
我对它如何工作甚至无法编译感到困惑gcc
。数组的大小应该是静态的,并且是在编译时确定的,不是吗?
这是有效的C99功能,称为可变长度数组(VLA),如果进行编译,gcc -std=c90 -pedantic
则会收到以下警告:
警告:ISO C90禁止使用可变长度数组'array'[-Wvla]
使用-std=c99 -pedantic
不会产生警告,虽然两者gcc
和clang
支持VLA以外C99模式以及在C ++不允许VLA作为扩展。
我们可以从C99草案标准部分的6.7.5.2
数组声明器第4段中看到(强调我的):
如果不存在大小,则数组类型为不完整的类型。如果size是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型作用域的声明中使用; 124)此类数组仍然是完整类型。如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型为可变长度数组类型。
请注意,即使Visual Studio现在支持C99,它们也不支持VLA。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句