繁体   English   中英

ISO C90 禁止变长数组

[英]ISO C90 forbids variable length array

我正在动态计算数组的大小。 就像是:

void foo(size_t limit)
{
  char buffer[limit * 14 + 1];
}

但只是 GCC 编译器说:

error: ISO C90 forbids variable length array ‘buffer’

搜索 SO 我找到了这个答案

C99 §6.7.5.2:

如果大小是一个不是整数常量表达式的表达式... ...每次计算它时,它的值都应大于零。

因此,我将大小限制类型变量重新声明为:

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限定如何:虽然没有什么可以阻止原则上,如果整数变量是在同一个翻译单元中初始化的,那么您必须将具有可见定义的特殊变量与定义位于不同翻译单元的那些变量分开,并且必须禁止暂定定义或需要多次编译通过因为在整个翻译单元被解析之前,暂定定义的变量的初始化值是未知的。

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 not constant

C90 不允许变长数组。 但是,您可以使用c99-gcc编译器来完成这项工作。

您正在使用c90-gcc进行编译,但查看 C99 规范。

不,这不是错误。 您不能在 C90 中使用 VLA。 当你声明

const size_t limit

这不是一个常量表达式。 常量表达式类似于字面值666

请注意,C 在这方面与 C++ 有很大不同。 即使是这样的常数

const int i = 666;

不是 C 中的常量表达式。这是在 C 中通常使用#define声明常量值的主要原因。

正如您的问题中所写,这是来自 C99,而不是 C90,您需要针对 C99 对其进行编译才能使用可变长度数组。

const限定变量不是标准意义上的整数常量表达式。 这必须是文字常量、枚举常量、 sizeof或由这些组成的某些表达式。

如果可以,请切换到 C99。 gcc 选项是-std=c99 (或者 gnu99,如果你想要 gnu 扩展。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM