我正在使用以下代码。
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:错误:初始化元素不是常量
这是什么意思?我该如何修复我的代码?
答案 0 :(得分:20)
关键字const
的命名通常会误导人们,这意味着某些不可更改的常量值。至少在C中,它意味着只读。文件范围内的const
限定对象没有适当的常量作为数组初始值设定项。
作为非常量常量的示例,声明
是完全可以的 const volatile unsigned int milliseconds_since_boot;
是一个从编译器控件外部更新的值(想想HW寄存器),并且不允许分配给它,即它是只读的。
答案 1 :(得分: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。
答案 2 :(得分:6)
我不是一个合适的程序员;)但我会这样做:
#define X_ORIGIN (1233086)
#define Y_ORIGIN (-4728071)
#define Z_ORIGIN (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
这样它只是一个文本替换。如果编译器仍然至少吐出假人,那么距离知道问题的位置还有一步之遥。
答案 3 :(得分:4)
作为替代方案,这也适用于这种情况:
enum { X_ORIGIN = 1233086,
Y_ORIGIN = -4728071,
Z_ORIGIN = 4085704 };
const int xyzOrigin[] = { X_ORIGIN, Y_ORIGIN, Z_ORIGIN };
int main()
{
return 0;
}
答案 4 :(得分:2)
在C语言中,具有静态存储持续时间的对象必须使用常量表达式或使用包含常量表达式的聚合初始值设定项进行初始化。 - Answer of 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};
答案 5 :(得分: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};
}