初始化元素在C 中不是常量
可能重复:
尝试使用const初始化变量时,错误“初始化元素不是常量”
我来自javascript / php / python,可能我错过了什么,这里是代码:
const int a = 50; const int c = 100; const int d = 100; int endX = c + a; int endY = d; int startX, startY, b;
我明白了
ex1.4.c:6:错误:初始化元素不是常量
ex1.4.c:7:错误:初始化元素不是常量
有人有解释吗?
如果您将endX声明为全局变量,则错误是有意义的。
原因是全局变量在编译时初始化,并且您尝试将endX初始化为必须在执行时完成的操作。
不幸的是,在C const
变量中并不是真正的const。
以下是c99标准的摘录。
6.7.8初始化
- 具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字 。
常量定义如下:
6.4.4常数
句法
不变:
integer-constant (eg 4, 42L) floating-constant (eg 0.345, .7) enumeration-constant (stuff in enums) character-constant (eg 'c', '\0')
标准定义了常量表达式,如下所示:
6.6常量表达式
(7)初始化器中的常量表达式允许更大的纬度。 这样的常量表达式应为或评估为以下之一:
– 一个算术常量表达式,
– 空指针常量,
– 地址常量,或
– 对象类型的地址常量加上或减去整数常量表达式。
(8)算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常数,枚举常量,字符常量和sizeof表达式的操作数。 算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为操作数的一部分,而sizeof运算符的结果是整数常量。
因此, c
和a
不是常量表达式,在您的情况下不能用作初始值设定项。
const
表达式必须是C中的编译时常量,与C ++不同,因此c+a
不能用作常量。 在C中处理此问题的常用方法是使用预处理器 :
#define A 50 #define C 100 #define D 100 int endX = C + A; int endY = D; int startX, startY, b;
是的,你无法初始化变量。 编译器进行初始化,在编译时它不知道c+a
的值;
int x = 1;
类型初始化很好,编译器只在对象代码中的x
地址处放置1
。
要将某些内容初始化为c+a
,您希望在运行时, c
中的启动代码或C++
构造函数中执行此操作。
在C编程语言中,具有静态存储持续时间的对象必须使用常量表达式(或包含常量表达式的聚合)进行初始化。 如果endX
具有静态存储持续时间,则其初始化程序(c+a)
不是常量表达式(即,在转换阶段期间无法计算表达式)。