9

有了代码,

const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;

static unsigned int counts[N];

g++给出错误:

数组绑定在 »]« 标记之前不是整数常量

我正在使用g++/gcc版本 4.6.1

谁能告诉我为什么g++抱怨这种表达方式?

4

3 回答 3

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,符合新规则的条件,但您的编译器可能尚未实现它们。

于 2012-06-29T22:50:30.903 回答
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 在评论中指出的那样,浮点运算不能保证在编译时进行评估。 这是我找到的相关 SO 帖子。

于 2012-06-29T22:16:26.600 回答
1

正如 Ed 已经指出的,浮点运算的优化,包括常量折叠,不能保证在编译时发生。英特尔关于该主题的页面提供了一些示例,但主要是舍入行为可能不同,浮点运算可能会引发异常。本文更深入一些(第 8.3 节,“算术归约”)。

GCC 只支持

“浮点表达式收缩,例如如果目标具有对它们的本机支持,则形成融合乘加运算”

如编译器优化手册中 ffp-contract 标志的描述中所述。

于 2012-06-29T22:51:06.490 回答