使用代码
const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;
static unsigned int counts[N];
g++
给出错误:
数组绑定在»]«token
之前不是整数常量
我正在使用g++
/ gcc
版本4.6.1
有人可以告诉我g++
抱怨表达的原因吗?
答案 0 :(得分:7)
从2003年的ISO C ++标准来看,这不是整数常量表达式。引用标准第5.19节:
整数常量表达式只能涉及文字(2.13), 枚举器,
const
变量或整数或静态数据成员 用常量表达式初始化的枚举类型(8.5), 积分或枚举类型的非类型模板参数,和sizeof
个表达式。浮动文字(2.13.3)只有在出现时才会出现 它们被转换为整数或枚举类型。
你可以改变这个:
const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;
到此:
const int inverseRotationStep = 1000;
const int N = 2*int(M_PI)*inverseRotationStep + 3;
(假设M_PI
在某处定义;它未在标准中指定,但它是一个常见的扩展名。)
2011 ISO C ++标准略微放松了这一点。 5.19p3(引用N3337草案)说:
整数常量表达式是一个文字常量表达式 积分或无范围的枚举类型。
我认为 2*int(M_PI/rotationStep) + 3
,因此N
符合新规则,但很可能你的编译器还没有实现它们。
答案 1 :(得分:4)
问题在于......
g++ gives: array bound is not an integer constant before »]« token
const
值不是一个常量表达式(尽管这可能会让你感到困惑,这是可以理解的。)
const int N = 2*int(M_PI/rotationStep) + 3;
虽然这将是
const int N = 10;
正如@ildjarn在评论中指出的那样,不保证在编译时评估浮点运算。 Here is a related SO post I found.
答案 2 :(得分:1)
正如Ed已经指出的那样,不能保证在编译时优化浮点运算,包括常量折叠。关于这个主题的Intel's page给出了一些例子,但主要是舍入行为可能不同,浮点运算可能会抛出异常。 This paper更深入一些(第8.3节“算术减少”)。
GCC仅支持
“浮点表达式收缩,例如如果目标对它们有原生支持,则形成融合乘法 - 加法运算”
如compiler optimizations手册中对ffp-contract标志的描述中所述。