【发布时间】:2012-05-01 08:01:17
【问题描述】:
我正在动态计算数组的大小。比如:
void foo(size_t limit)
{
char buffer[limit * 14 + 1];
}
但只是 GCC 编译器说:
error: ISO C90 forbids variable length array ‘buffer’
搜索所以我发现this answer:
C99 §6.7.5.2:
如果大小是一个不是整数常量的表达式 表达式... ...每次评估它都应该有一个值 大于零。
所以,我将大小限制类型变量重新声明为:
void foo(const size_t limit)
但它继续向我发出警告。这是 GCC 错误吗?
【问题讨论】:
-
好吧,
C90 != C99。 -
将
size_t limit声明为const不会改变任何东西。它仍然是一个可变长度数组,因为大小是在运行时确定的。 -
GCC 告诉您,使用您使用的命令行选项,默认情况下它会根据 C90 标准进行编译。您引用的段落来自C99。这是您的问题的原因,而不是
limit的类型。 -
应该注意的是,GCC 本身支持可变长度数组作为语言扩展,所以如果你不是在 c99 模式下编译,这将工作 - 但它不是可移植的,除非你总是使用一个编译器有这样的扩展或实现 C99 的 VLA。
-
只需用
gcc -std=c99 -pedantic ...调用gcc