初始化元素在C中不是常量

pig*_*ack 16 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;
Run Code Online (Sandbox Code Playgroud)

我明白了

ex1.4.c:6:错误:初始化元素不是常量
ex1.4.c:7:错误:初始化元素不是常量

有人有解释吗?

Mak*_*zin 17

不幸的是,在C const变量中并不是真正的常量.

以下是c99标准的摘录.

6.7.8初始化

  1. 具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

常量定义如下:

6.4.4常数

句法

不变:

integer-constant       (e.g. 4, 42L)
floating-constant      (e.g. 0.345, .7)
enumeration-constant   (stuff in enums)
character-constant     (e.g. 'c', '\0')
Run Code Online (Sandbox Code Playgroud)

标准定义了常量表达式,如下所示:

6.6常量表达式

(7)初始化器中的常量表达式允许更大的纬度.这样的常量表达式应为或评估为以下之一:

- 算术常量表达式,

- 空指针常量,

- 地址常量,或

- 对象类型的地址常量加上或减去整数常量表达式.

(8)算术常量表达式应具有算术类型,并且 只能具有整数常量,浮点常数,枚举常量,字符常量和sizeof表达式的操作数.算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为sizeof运算符的操作数的一部分,其结果为整数常量.

因此,ca不是常量表达式,不能作为你的情况初始化.


Her*_*uez 5

如果您将 endX 声明为全局变量,则该错误是有道理的。

原因是全局变量是在编译时初始化的,而你试图将endX初始化为一个必须在执行时完成的操作。

  • -1. 这个答案是错误的。没有什么可以阻止编译器在执行时间之前计算 endX。事实上,g++会很高兴地编译这个。只是海湾合作委员会对其将接受的东西过于胡思乱想。 (10认同)

non*_*one 5

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;
Run Code Online (Sandbox Code Playgroud)

  • 如果`c`和`a`是编译时常量,那么`c + a`也是(以及指定该表达式的任何东西).并不是说C++不要求const表达式是编译时常量; 这是C++足够聪明,意识到`const int + const int`是一个编译时常量,而C不是那么聪明. (2认同)