c - 数组边界在 ']' 标记之前不是整数常量,而实际上它是常量

标签 c

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

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表达式和作为强制转换的直接操作数的浮点常量。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 的操作数的一部分。或_Alignof运算符。
    • 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 如果大小是一个不是整数常量表达式的表达式:如果它出现在函数原型(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 - 数组边界在 ']' 标记之前不是整数常量,而实际上它是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694542/

相关文章:

c - 如何在 C 中的二维双数组中读取 .pgm 图像文件

c 程序未写入与显示相同的结果

c - 从文件读取并存储到C中的二维数组中

在Windows上编译C99兼容的.so

c - Android NDK中的文件操作

c - printf %n 如何计算字符数?

java - 在 Linux 上调用 JNI 代码时奇怪的崩溃;我是否正确编译了我的共享库?

c - 为什么我必须在控制台屏幕上获得输出之前再输入一个数字?

C:#define 函数体内

c - 字符常量中的多个字符