g ++:数组绑定不是整数常量

时间:2012-06-29 22:15:06

标签: c++ g++ constants

使用代码

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++抱怨表达的原因吗?

3 个答案:

答案 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值不是一个常量表达式(尽管这可能会让你感到困惑,这是可以理解的。)

编辑:我第一次看到这个时就假设了C.这里的问题是这个表达式在编译时没有被评估:

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标志的描述中所述。