以下代码有什么问题?
#define DELAY_CYCLES ((int)(0.1/0.001))
typedef struct {
double state_history[N_X][DELAY_CYCLES];
double foo;
} foo
gcc抱怨:
main.h:52:3:警告:在文件范围内修改了'state_history'
是因为int cast由于某种原因无法在编译时完成吗?
Ada*_*eld 12
再次编辑
如果你遵循标准的字母,那么是的,你应该避免浮点表达式.在C中,除了转换为整数的浮点常量(例如(int)3.0f)之外,为了进行数组大小计算,浮点表达式在编译时不被视为整型常量表达式.您需要修改定义以避免浮点数并仅使用整数.
为了不成为可变长度数组,数组大小必须是"整数常量表达式"(C99§6.7.5.2/ 4),并且"整数常量表达式"在§6.6/ 6中定义(强调我的):
一个整数常量表达式96)应具有整数型和应仅具有是积分常数,枚举常数,字符常数,操作数
sizeof表达式,其结果是积分常数,和浮点常量是铸件的立即操作数.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.
似乎GCC仅在4.5版中添加了该警告.在4.4及以下版本中,即使使用,也不会报告该代码的任何警告-Wall -Wextra -ansi -pedantic.但是,为了安全且100%可移植,您应该更改定义DELAY_CYCLES以避免浮点表达式.
即使它是整数常量表达式,(int)(0.1/0.001)也可以轻松地为99或100,因为这些值0.1和0.001 都不存在于浮点中。要确定IEEE 754指定哪个值,将需要同时检查0.1和0.001,以查看它们是否更接近或高于或低于其邻居,然后实际进行这些邻居的划分-或仅在一致性系统上进行检查。但是,这是我不想依靠一致的实现来获得正确答案的地方。