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

时间:2012-10-05 16:58:49

标签: c

  

可能重复:
  Error “initializer element is not constant” when trying to initialize variable with 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:错误:初始化元素不是常量

有人有解释吗?

5 个答案:

答案 0 :(得分:17)

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

以下是c99标准的摘录。

  

6.7.8初始化

     
      
  1. 具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串   文字即可。
  2.   

常量定义如下:

  

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')

标准定义常量表达式如下:

  

6.6常量表达式

     

(7)初始化器中的常量表达式允许更大的纬度。这样的常数表达式应该是或评估为一个   以下内容:

     

- 算术常量表达式

     

- 空指针常量,

     

- 地址常量或

     

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

     

(8)算术常量表达式应具有算术类型   只有操作数,它们是整数常量,浮点常量,   枚举常量,字符常量和sizeof表达式。   算术常量表达式中的转换运算符只能转换   算术类型的算术类型,除了作为操作数的一部分   一个sizeof运算符,其结果是一个整数常量。

因此,ca不是常量表达式,在您的情况下不能用作初始值设定项。

答案 1 :(得分: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;

答案 2 :(得分:4)

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

原因是全局变量在编译时初始化,并且您尝试将endX初始化为必须在执行时完成的操作。

答案 3 :(得分:2)

是的,你无法将某些内容初始化为变量。编译器执行初始化,在编译时它不知道c+a;

的值

int x = 1;类型初始化很好,编译器只在对象代码中的1地址放置x

要将某些内容初始化为c+a,您希望在运行时,c中的启动代码或C++中的构造函数中执行此操作。

答案 4 :(得分:0)

在C编程语言中,具有静态存储持续时间的对象必须使用常量表达式(或包含常量表达式的聚合)进行初始化。如果endX具有静态存储持续时间,则其初始化程序(c+a)不是常量表达式(即,在转换阶段无法计算表达式)。