我动态计算数组的大小。
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:
如果 size 是一个不是整数常量表达式的表达式……每次求值时,它都应具有大于零的值。
所以,我做了大小限制类型变量的重新声明:
void foo(const size_t limit)
但它继续给我警告。这是一个 GCC 错误?
const
-限定一个变量并不能使它成为一个编译时常量(参见 C99 6.6 § 6 的整数常量表达式的定义),在引入可变长度的数组之前 C99,数组大小需要是编译时常量。
很明显,const
-qualify 一个变量不会使它成为一个编译时常量,特别是在函数参数的情况下,它不会被初始化,直到函数被调用。
我看到您的问题的以下解决方案:
通过-std=c99
或-std=gnu99
将代码编译为 C99
通过malloc()
分配您的缓冲区
如果可用,请使用alloca()
,这是最接近 C90 的可变长度数组
选择始终使用的最大缓冲区大小,如果给定的limit
参数溢出,则会失败
作为一个侧面说明,即使 C99 允许可变长度的数组,它仍然是非法的使用具有静态存储持续时间的整数变量的值作为具有静态存储持续时间的数组的大小,而不管const
-qualification:虽然没有什么可以阻止这在原则上,如果整数变量是在同一个翻译单元中初始化,你必须允许特殊情况下的变量具有可见的定义,从那些定义驻留在不同的翻译单元,将有
const
在 C 中不引入常量,而是引入只读变量。
#define SIZE 16
char bla[SIZE]; // not a variable length array, SIZE is a constant
但是
const int size = 16;
char bla[size]; // C99 variable length array, size is a constant
C90 不允许可变长度数组。但是,您可以使用c99-gcc
编译器来完成这项工作。
您正在编译c90-gcc
,但正在查看 C99 规范。
不,它不是一个 bug。你不能在 C90 中使用 VLA。当你声明
const size_t limit
常量表达式将类似于文字值666
。
请注意,C 在这方面与 C ++ 有很大不同。甚至像这样的常量
const int i = 666;
在 C 中不是常量表达式。这是在 C 中通常用#define
声明常量值的主要原因。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(42条)