为什么我得到一个关于初始化器不是常量的错误?

Cod*_*lus 10 c const initializer

我使用以下代码.

const int X_ORIGIN = 1233086;             
const int Y_ORIGIN = -4728071;              
const int Z_ORIGIN = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
Run Code Online (Sandbox Code Playgroud)

当我编译它时,GCC给我以下错误.

Transformations.h:16:1:错误:初始化元素不是常量

那是什么意思?我该如何修复我的代码?

Jen*_*ens 20

人们常常误导关键字的命名const,这意味着某些不可改变的常数值.至少在C中,它意味着只读.const文件范围内的限定对象没有适当的const用作数组初始值设定项.

作为非常量constness的一个例子,声明是完全可以的

 const volatile unsigned int milliseconds_since_boot;
Run Code Online (Sandbox Code Playgroud)

是一个从编译器控件外部更新的值(想想HW寄存器),并且不允许分配给它,即它是只读的.

  • 为什么选择downvote?如果有问题,请给我机会补救. (4认同)
  • 不是我的 DV,但你可以更详细地阐述 OP 的实际问题。对于初学者来说,这个例子很难理解,因为他们甚至可能不知道“HW寄存器”是什么。 (2认同)

Pau*_*l R 14

您不能在C中的全局范围内执行此操作,仅在本地范围内,即在函数内:

#define NUM_DIMENSIONS 3

const int X_ORIGIN = 1233086;             
const int Y_ORIGIN = -4728071;              
const int Z_ORIGIN = 4085704;

const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; // FAIL

void foo(void)
{
    const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; // OK
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将代码编译为C++而不是C.


Joh*_*n U 6

我不是一个合适的程序员;)但我会这样做:

#define X_ORIGIN (1233086)
#define Y_ORIGIN (-4728071)
#define Z_ORIGIN (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
Run Code Online (Sandbox Code Playgroud)

这样它只是一个文本替换.如果编译器仍然至少吐出假人,那么你就更接近知道问题所在.

  • @nathanwhite关心详细说明?宏解决问题就好了!(假设`NUM_DIMENSIONS`在某处定义). (4认同)
  • @nathanwhite这些正是"初始化元素不是常数"错误的原因.将"NUM_DIMENSIONS"作为变量(const是否合格)会在文件范围内导致"可变修改的"xyzOrigin". (2认同)