C 固定大小数组被视为可变大小

2023-11-26

我一直在尝试定义一个静态数组,其大小应该在编译时已知(它是一个常量表达式)。当数组包含浮点常量时,gcc 似乎无法确定数组的大小(并且我得到“...的存储大小不是常量”)。

这是一个最小的例子:

int main(void)
{
    static int foo[(unsigned)(2 / 0.5)];
    return 0;
}

这种行为的原因是什么?

EDIT

我已经得到了我需要的答案。我仍然不明白不允许这种表达的理由,但这是一个单独的问题。 我将解释一下我是如何解决这个问题的。

这是关于我作为练习而编写的游戏。单位在战场上移动,我将移动分为步骤。我必须记住每个步骤上每个单元的位置,以便稍后可以显示动画。选择台阶数是为了确保在某个台阶上,单位之间的距离足够近,可以互相战斗,但又不会太近而发生碰撞。以下是相关代码片段:

#define UNIT_SPEED_LIMIT 12
#define DISTANCE_MELEE 0.25
#define MOVEMENT_STEPS (unsigned)(2 * UNIT_SPEED_LIMIT / DISTANCE_MELEE)

struct position (*movements)[MOVEMENT_STEPS + 1];

定义DISTANCE_MELEE(可以进行近距离战斗的最大距离)并使用它来计算步数似乎是进行的自然方法(更是如此,因为我在多个上下文中使用这个常量)。因为我无法定义movements这样,我必须发明一个像“单个距离单位的步数”这样的概念,并使用乘法int而不是除以double。我想避免动态内存分配以保持代码简单。


根据公开的 C99 草案标准 n1256,数组声明的语法描述为

6.7.5.2 数组声明符

2

具有可变修改类型的普通标识符(如 6.2.3 中定义)应具有 要么是块作用域,要么没有链接或函数原型作用域。如果声明了一个标识符 作为具有静态存储持续时间的对象,它不应具有变长数组类型。

4

如果不存在大小,则数组类型是不完整类型。如果尺寸是 * 而不是 表达式,数组类型是变长数组类型 未指定大小,只能在带有函数的声明中使用 原型范围; 124) 这样的数组仍然是完整的类型。如果 大小是整数常量表达式,元素类型有 已知常量大小,该数组类型不是变长数组 类型;否则,数组类型是变长数组类型。

所以表达式中的[]必须是一个整型常量表达式用于声明数组static储存期限。该标准对整数常量表达式有这样的规定:

6.6 常量表达式

6

整数常量表达式 99) 应具有整数类型并且应 仅具有整数常量、枚举常量的操作数, 字符常量、结果为整数的 sizeof 表达式 常量和作为立即操作数的浮点常量 演员表。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数。

很遗憾,(unsigned)(2 / 0.5)不应用强制转换立即地到一个浮点常量,而是一个算术常量表达式。这并不构成整型常量表达式,因此不允许作为数组的大小static储存期限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 固定大小数组被视为可变大小 的相关文章

随机推荐