我一直在尝试定义一个静态数组,其大小应该在编译时已知(它是一个常量表达式)。当数组包含浮点常量时,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(使用前将#替换为@)