gpt4 book ai didi

c - ISO C90 禁止变长数组

转载 作者:行者123 更新时间:2023-11-30 16:58:16 25 4
gpt4 key购买 nike

我正在动态计算数组的大小。像这样的东西:

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/38999074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com