繁体   English   中英

在文件范围内可变地修改数组

[英]Variably modified array at file scope

以下代码有什么问题?

#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强制转换?

再次编辑

如果您遵循字母的标准,那么可以,您应该避免在其中使用浮点表达式。 在C语言中,除了将浮点常量强制转换为整数(例如(int)3.0f )外,出于数组大小计算的目的,在编译时不将浮点表达式视为整数常量表达式。 您需要修改定义以避免浮点数,而只能使用整数。

为了不成为可变长度数组,要求数组大小为“整数常量表达式”(C99§6.7.5.2/ 4),并且在第6.6 / 6节(强调我的)中定义了“整数常量表达式”:

整数常量表达式 96)应具有整数类型,并且仅应具有整数常量,枚举常量,字符常量, sizeof表达式(其结果为整数常量)和浮点常量(它们是cast的立即数)的操作数 整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,但作为操作数的一部分要转换为sizeof运算符。

看来GCC仅在4.5版中添加了该警告。 在4.4及以下版本中,即使使用-Wall -Wextra -ansi -pedantic ,它也不会报告该代码的任何警告。 但是,为了安全和100%可移植,您应该更改DELAY_CYCLES的定义以避免浮点表达式。

即使它是整数常量表达式,由于浮点数中不存在0.10.001(int)(0.1/0.001)可以很容易地是99或100。 要确定IEEE 754指定哪个值,将需要同时检查0.1和0.001,以查看它们是否更接近或高于或低于其邻居,然后实际进行这些邻居的划分-或仅在一致性系统上进行检查。 但是,这是我不想依靠一致的实现来获得正确答案的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM