10

我正在使用以下代码。

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};

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

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

这意味着什么?如何修复我的代码?

4

6 回答 6

20

通常人们会被关键字的命名误导const,暗示一些不能改变的常数值。至少在 C 中,它意味着readonlyconst文件范围内的合格对象没有适当的常量来充当数组初始值设定项。

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

 const volatile unsigned int milliseconds_since_boot;

是一个从编译器控制之外更新的值(想想硬件寄存器),你不能分配给它,即它是只读的。

于 2012-07-18T13:24:40.070 回答
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
}

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

于 2012-07-18T12:16:52.207 回答
6

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

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

这样,它只是一个文本替换。如果编译器仍然吐出假人,至少你离知道问题出在哪里更近了一步。

于 2012-07-18T12:17:59.127 回答
4

作为替代方案,这也适用于这种情况:

enum { X_ORIGIN = 1233086,
       Y_ORIGIN = -4728071,
       Z_ORIGIN = 4085704 };

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

int main()
{
    return 0;
}
于 2012-07-18T12:27:00.147 回答
2

在 C 语言中,具有静态存储持续时间的对象必须使用常量表达式或包含常量表达式的聚合初始值设定项进行初始化。——AndreyT的回答

看完之后,你一定知道NUM_DIMENSIONS,如果它有const-资格,那不是一个常数!然后你不能以这种方式初始化你的数组。

使用此代码:

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

你应该使用:#define NUM_DIMENSIONS 3或者你可以在方括号内声明没有任何变量const int xyzOrigin[] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

于 2012-07-18T13:11:56.763 回答
0

正如三氯生所说:

main()
{
    const int X_ORIGIN = 1233086;
    const int Y_ORIGIN = -4728071;
    const int Z_ORIGIN = 4085704;
    const int xyzOrigin[] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
}

这工作正常...

或者,如果您事先知道尺寸,则:

#define DIM 3

main()
{
    const int X_ORIGIN = 1233086;
    const int Y_ORIGIN = -4728071;
    const int Z_ORIGIN = 4085704;
    const int xyzOrigin[DIM] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
}
于 2012-07-18T12:19:54.213 回答