2011-01-25 62 views
4

以下代码有什么问题?文件范围内的可变修改阵列

 
#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投不能由于某种原因完成编译时?

回答

9

再次编辑

如果按照标准的信,那么,你应该避免浮点表达式那里。在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的定义以避免浮点表达式。

+0

我使用的是gcc 4.5.2。即使将N_X取出,我也会收到警告。不必使用任何额外的警告标志。 – allanw 2011-01-25 03:44:47

3

即使它是一个整数常量表达式,(int)(0.1/0.001)可以很容易地要么99或100中,由于值0.10.001不浮点存在。确定IEEE 754规定的值将需要检查0.1和0.001两者,以确定它们是否更接近其邻居的上方或下方,然后实际上是对这些邻居进行分割 - 或者只是在符合标准的系统上进行检查。然而,这是我不想依赖实现来达到正确答案的地方。