关于全局变量及静态变量和initializer element is not constant问题

关于 static storage duration: C99 6.2.4 Storage durations of objects 第3款: 3 An object whose identifier  is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime  is the entire execution of the program and its stored value  is initialized only once, prior to program startup.

//原始错误的代码

node *p;

p = new node;

int main(void)

{…}

//修改后的代码

node *p = new node;

int main(void)

{…}

找了好久不知道什么错误,我虽然很快帮他修改正确了,但却不明白其实质

查了好久,可能有点专牛角尖,是关于c c++全局变量赋值的问题,同时也关系到初始化和赋值的关系等

http://topic.csdn.net/u/20090129/19/d8661d27-4790-46cb-a424-c4fc8f7e28b4.html 
这个帖子讨论了下c语言中全局变量的初始化 
//test.c 
char * p1 = (char *) malloc(10);  //出现 initializer element is not constant错误 
int main(void) 

  ... 

这个的原因已经弄明白,应该是C标准没有弄清楚,在c99中指明全局变量和static变量的初始化式必须为常量表达式,因此类似这样的情况也是有错误(VC和gcc下测试) 
//test.c 
int a = 1; 
int b = a; 
int main(void) 

  .... 

或者

//test.c 
int main(void) 

    int a = 1; 
    static int b = a; 
}

出现的错误都是initializer element is not constant,即初始值不是常量 
上面是c语言的

c99标准描述如下: 
C99标准 6.7.8 Initialization 第4款: 
4 All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

关于 static storage duration: 
C99 6.2.4 Storage durations of objects 第3款: 
3 An object whose identifier is declared with external or internal linkage, or with the 
storage-class specifier static has static storage duration. Its lifetime is the entire 
execution of the program and its stored value is initialized only once, prior to program startup.

关于复杂类型 (比如struct): 
C99 6.5.2.5 Compound literals 第7款: 
7 All the semantic rules and constraints for initializer lists in 6.7.8 are applicable to 
compound literals. 
(参考 http://bbs.chinaunix.net/viewthread.php?tid=1275329&extra=&page=5 帖子 问题类似)

在c++中,编译器可能有所改进,上面的几个问题基本已经没有 
可参考下这个帖子,关于全局变量初始化的: http://blogold.chinaunix.net/u1/41728/showart_347212.html

c、c++全局变量的赋值要在函数内部进行!

看下面测试例子:

int a;

a = 10; //这里是对全局变量进行赋值操作,是错误的

int main(void)

{

}

例如下面这个帖子:

http://topic.csdn.net/u/20100616/10/3823436c-f19c-40f0-9053-374f58c56d11.html

类似这样的情况也是不可以的:

printf(“hellow\n”);

int main(void)

{…}

总结下:

1、c语言中全局变量和static变量的初始化需要指定一个常量,不能是一个非常量的表达式;而在c++中是可以的

2、在操作c和c++全局变量时,只能对其采用初始化的方式,而不能采用赋值的方式,即可以

int a = 10; //错误

而不可以:

int a;

a = 10;

看来这应该是一非常简单的问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: [错误] 初始化元素不是常量 这个错误通常出现在C语言中,意味着在初始化一个变量时,使用了不是常量的表达式。在C语言中,初始化的值必须是常量表达式,也就是在编译时就能确定的值。 例如,以下代码会出现这个错误: int a = 1; int b = a + 2; // 错误:初始化元素不是常量 因为a + 2不是常量表达式,编译器无法在编译时确定b的值。要解决这个错误,可以将表达式改为常量表达式,或者使用变量赋值语句来初始化变量。 ### 回答2: 【错误】初始值设定项不是常量。 这个错误信息通常会在C或C++编程语言中出现。它的意思是在定义变量时,变量的初始值不是一个常量值。 在C和C++中,有一些变量的初始值必须是常量,也就是在编译时已经确定的值。而在这个错误中,你可能使用了一个运行时才能确定的值。 例如,在全局变量定义中,如果你给变量赋值了一个函数的返回值,或者一个变量的值,那么这个错误就可能会出现。因为在编译时,这些值是无法确定的,所以会导致这个错误。 为了解决这个错误,你可以考虑以下几种方法: 1. 将变量的初始值改为一个常量值,例如使用一个具体的数值或字符串来代替函数返回值或变量的值。 2. 将变量定义和赋值操作分开,在程序中的某个地方再给变量赋值。这样可以避免在定义时使用非常量值。 3. 使用宏定义来代替变量定义。宏定义在编译时进行文本替换,所以可以避免这个错误。 总之,当遇到“初始值设定项不是常量”这个错误时,你需要检查变量的初始值是否是一个常量,并根据具体情况采取适当的解决方法。 ### 回答3: "[error] initializer element is not constant" 的错误是在使用静态或全局变量初始化时出现的错误。出现这个错误的原因是,这些变量的初始化值不是常量,无法在编译时确定。 在C语言中,静态和全局变量的初始化必须使用常量表达式,即在编译时就可以确定的值。常量表达式可以是直接使用一个常量,也可以是通过一些简单的运算或符号来计算得到的值。 如果在初始化静态或全局变量时遇到 "[error] initializer element is not constant" 的错误,可能是因为使用了无法在编译时确定的值进行初始化。解决这个错误的方法是,确保使用常量或常量表达式进行初始化。可以通过在初始化时使用常量来修复这个错误。 例如,下面的代码中,在声明全局变量时,将其初始化为 10,这是一个常量: ```c #include <stdio.h> int globalVariable = 10; int main() { printf("Global variable: %d\n", globalVariable); return 0; } ``` 在这个例子中,全局变量 `globalVariable` 在声明时初始化为 10,这是一个常量。因此,不会出现 "[error] initializer element is not constant" 的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值