我正在动态计算数组的大小。像这样的东西:
void foo(size_t limit)
{
char buffer[limit * 14 + 1];
}
但只是 GCC 编译器说:
error: ISO C90 forbids variable length array ‘buffer’
搜索 SO 我找到了 this answer :
C99 §6.7.5.2:
If the size is an expression that is not an integer constant expression... ...each time it is evaluated it shall have a value greater than zero.
因此,我将大小限制类型变量重新声明为:
void foo(const size_t limit)
但它继续给我警告。这是 GCC 错误吗?
最佳答案
const
- 限定变量不会使其成为编译时常量(有关整数常量表达式的定义,请参阅 C99 6.6 §6),以及之前随着 C99 引入可变长度数组,数组大小需要成为编译时常量。
很明显,const
限定变量不会使其成为编译时常量,特别是在调用函数之前不会初始化的函数参数的情况下。
我看到了以下针对您的问题的解决方案:
- 通过
-std=c99
或-std=gnu99
将您的代码编译为 C99> - 通过
malloc()
分配您的缓冲区 - 如果可用,请使用
alloca()
,这是最接近 C90 可变长度数组的方法 - 选择一个始终使用的最大缓冲区大小,如果给定的
limit
参数溢出则失败
作为旁注,即使 C99 允许可变长度数组,使用具有静态存储持续时间的整数变量的值作为具有静态存储持续时间的数组的大小仍然是非法的,无论 const
-qualification:如果整数变量在同一个翻译单元中初始化,原则上没有什么可以阻止这一点,但您必须从那些定义驻留在不同翻译单元中的变量中获得具有可见定义的特殊情况变量,并且要么必须禁止临时定义或需要多次编译通过,因为在整个翻译单元被解析之前,临时定义变量的初始化值是未知的。
关于c - ISO C90 禁止可变长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234288/