有了代码,
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++
抱怨这种表达方式?
从 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
,符合新规则的条件,但您的编译器可能尚未实现它们。
问题是……
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 帖子。