gpt4 book ai didi

c - 数组绑定(bind)在 ']' 标记之前不是整数常量,而实际上它是常量

转载 作者:行者123 更新时间:2023-12-04 10:24:13 24 4
gpt4 key购买 nike

我正在尝试拥有一个数组,该数组在编译时具有已知的定义大小。

const uint8_t a[2] = {0, 127}; // Fine
const uint8_t aRange = a[1] - a[0]; // Fine
double sums[aRange]; //Fails

但这通过 gcc 失败了

error: array bound is not an integer constant before ']' token.



作为一种解决方法,我打算使用宏变量。但想知道它背后是否有任何逻辑。有 this答案,这是最相关的。但是,根据答案,它应该有效。

最佳答案

aRange是一个常数整数,但不是整数常数。英语不是一门有趣的语言吗?

  • C11 §6.4.4.1 Integer constants
  • C11 §6.6 Constant expressions ¶6
  • 整数常量表达式 117) 应具有整数类型,并且只能具有整数常量、枚举常量、字符常量、sizeof 的操作数。结果为整数常量的表达式,_Alignof表达式和作为强制转换的直接操作数的 float 常量。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 操作数的一部分。或 _Alignof运算符(operator)。
  • 117) 在许多情况下都需要整数常量表达式,例如结构的位域成员的大小、枚举常量的值以及非可变长度数组的大小。适用于条件包含预处理指令中使用的整数常量表达式的进一步约束在 6.10.1 中讨论。
  • C11 §6.7.6.2 Array declarators ——标准中更难以理解的部分之一。 (¶2 是一个约束;¶4 和 ¶5 指定数组声明符的语义。)
  • ¶2 如果标识符被声明为具有可变修改类型,则它应为普通标识符(如 6.2.3 中定义),没有链接,并且具有 block 范围或函数原型(prototype)范围。如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型。
  • ¶4 如果大小不存在,则数组类型是不完整的类型。如果大小为 *数组类型不是一个表达式,而是一个未指定大小的可变长度数组类型,它只能用于具有函数原型(prototype)范围的声明或类型名称;143) 这样的数组仍然是完整的类型。如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。 (可变长度数组是实现不需要支持的条件特性;参见 6.10.8.3。)
  • 143)因此,*只能在不是定义的函数声明中使用(见 6.7.6.3)。
  • ¶5 如果 size 是一个不是整数常量表达式的表达式:如果它出现在函数原型(prototype)范围的声明中,则将其视为被 * 替换。 ;否则,每次对其进行评估时,它的值都应大于零。可变长度数组类型的每个实例的大小在其生命周期内不会改变。其中大小表达式是 sizeof 的操作数的一部分运算符和更改大小表达式的值不会影响运算符的结果,未指定是否评估大小表达式。

  • 在文件(全局)范围内,您必须有一个用于数组维度的整数常量表达式。在 C99 或更高版本的局部变量中,您编写的内容对于 VLA(可变长度数组)来说是可以的。

    您可以使用以下方法解决此问题:
    enum { A_MIN = 0, A_MAX = 127 };
    const uint8_t a[2] = { A_MIN, A_MAX };
    const uint8_t aRange = a[1] - a[0];
    double sums[A_MAX - A_MIN];

    在 C 中,你不能写 const uint8_t aRange = a[1] - a[0];在文件(全局)范围内,因此您的代码应该没问题,除非您使用的是不能识别 C99 或更高版本的过时 C 编译器(或者它定义了 __STDC_NO_VLA__ )。

    关于c - 数组绑定(bind)在 ']' 标记之前不是整数常量,而实际上它是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694542/

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