C90食戟之灵田所惠本子:ISO C90禁止可变长度数组(iso c90 forbids variable length arr

我动态计算数组的大小。

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 错误?

14

const-限定一个变量并不能使它成为一个编译时常量(参见 C99 6.6 § 6 的整数常量表达式的定义),在引入可变长度的数组之前 C99,数组大小需要是编译时常量。

很明显,const-qualify 一个变量不会使它成为一个编译时常量,特别是在函数参数的情况下,它不会被初始化,直到函数被调用。

我看到您的问题的以下解决方案:

通过-std=c99-std=gnu99将代码编译为 C99

通过malloc()分配您的缓冲区

如果可用,请使用alloca(),这是最接近 C90 的可变长度数组

选择始终使用的最大缓冲区大小,如果给定的limit参数溢出,则会失败

作为一个侧面说明,即使 C99 允许可变长度的数组,它仍然是非法的使用具有静态存储持续时间的整数变量的值作为具有静态存储持续时间的数组的大小,而不管const-qualification:虽然没有什么可以阻止这在原则上,如果整数变量是在同一个翻译单元中初始化,你必须允许特殊情况下的变量具有可见的定义,从那些定义驻留在不同的翻译单元,将有

6

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
3

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

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

2

不,它不是一个 bug。你不能在 C90 中使用 VLA。当你声明

const size_t limit

常量表达式将类似于文字值666

请注意,C 在这方面与 C ++ 有很大不同。甚至像这样的常量

const int i = 666;

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(702)
Dc插头:PrometheusAlertmanagerdc警报消息onyldc团队
上一篇
Checkpoint如何使用:如何在SSIS中使用CheckPoint For循环容器
下一篇

相关推荐

  • comeandgetyourlove音乐爱就在你身边

    Come and Get Your Love是一首热门的歌曲,由美国摇滚乐队Redbone演唱。这首歌曲于1974年发行,被收录在他们的专辑《Wovoka》中。歌曲以放克曲风为主,旋律活泼,曲调悠扬,歌词朗朗上口,深受歌迷喜爱。…

    2023-06-29 07:47:31
    0 53 27
  • css预编译器: center;}

    CSS预编译器是一种用于构建CSS的工具,它可以将CSS代码转换为更易于管理和维护的格式。它们可以使CSS代码更加灵活,更易于重用,并且可以帮助开发人员更轻松地组织和管理CSS代码。…

    2023-04-30 05:19:08
    0 25 44
  • python中predict函数参数:如何使用Python的predict函数进行机器学习预测

    示例示例predict函数是scikit-learn中的一个函数,用于预测新样本的输出结果。参数:…

    2023-03-30 08:03:12
    0 30 43
  • canvas 官网Bring Your Ideas to Life with Creative Artwork

    Canvas 官网是一个用于创建图形的 HTML5 API,它可以在浏览器中使用 JavaScript 来绘制 2D 图形。它提供了一个可以在网页上绘制图形的强大工具,可以用来创建动画、游戏、数据可视化等。…

    2023-02-28 09:52:08
    0 71 71
  • qt creator快速入门 第3版 pdf从零开始

    Qt Creator快速入门第3版是一本关于Qt Creator的教程书,旨在帮助读者快速掌握Qt Creator的使用。书中介绍了Qt Creator的基本功能,如如何创建项目、编辑代码、调试代码以及创建应用程序等等。书中还提供了一些实例代码,帮助读者更好地理解Qt Creator的用法。…

    2023-05-16 03:03:33
    0 68 51
  • cherry键盘win键不能用:解决Cherry键盘Win键无法使用的措施

    如果您的cherry键盘win键不能用,可能是由于系统设置问题导致的。下面提供一些代码,可以帮助您解决这个问题:打开“控制面板”,然后点击“硬件和声音”,打开“键盘”选项卡。…

    2023-08-27 03:36:33
    0 78 17
  • certificate意思一步一步指南

    示例示例是一种用于证明某个人或机构拥有某种资格或资质的文件。它可以是一种认证,也可以是一种奖励或认可。代码示例:…

    2023-09-14 15:01:58
    0 23 65
  • win10系统ctrl加c不能复制:解决win10系统下Ctrl+C不能复制的问题

    解决方案解决方案答:可能是由于系统快捷键被修改所导致的,可以尝试恢复系统默认快捷键;…

    2023-04-15 00:45:32
    0 29 98

发表评论

登录 后才能评论

评论列表(61条)