2012-12-09 44 views
6
#include <stdio.h> 

int i=10; 
int j=i; 
int main() 
{ 
    printf("%d",j); 
} 

我得到一个错误,指出初始化元素不是常量?这背后的原因是什么?使用非常量初始化器定义全局变量

+0

'i'是一个变量,而不是一个常量。而C不允许用于全局或静态变量的非常量初始值设定项。 C在这方面与C++不同。 –

+0

@ATaylor Nope。 const int不解决它。 –

+1

@ user963472:在C中(与C++不同)'const'声明不会生成常量表达式。 –

回答

12

这是什么原因?

C(与C++不同)不允许使用非常量值初始化全局值。

C99标准:节6.7.8:

所有在一个初始化表达式对于具有静态存储期限为常量表达式或字符串文字的对象。

+0

我在互联网上看到静态存储的变量是在加载时分配的。这是否与我的上述问题有关。 –

+0

@ user963472:我不明白你的问题。你能否详细说明一下? –

2

你可以尝试使用:

int i=10; 
int j=0; 

int main() 
{ 
    j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code 
    return 0; 
} 

唯一真正的C方法是在运行时进行初始化。尽管在C++中,你的代码可以正常工作,没有任何编译错误。

C标准明确禁止使用非常数值初始化全局对象。 C99标准的Section 6.7.8说:

所有在初始化表达式有静态 存储时间应是常量表达式或字符串文字的对象。

对象与static storage duration的定义是在节6.2.4:

其标识符被声明与外部或内部 联动,或与存储类说明静态对象具有静态存储 持续时间。它的生存期是程序的整个执行过程,其存储值在程序启动之前仅初始化一次。

1

这个要求背后的想法是让所有的静态存储持续时间对象在编译时初始化。编译器以预初始化形式准备所有静态数据,以便在运行时不需要额外的初始化代码。即当编译的程序被加载时,所有这些变量在已经初始化的状态下开始其生命。

在C语言的第一个标准化版本(C89/90)中,这个要求也适用于聚合初始值设定项,即使它们与局部变量一起使用。

void foo(void) 
{ 
    int a = 5; 
    struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */ 
} 

显然该限制的原因是总初始化原本应建在提前预初始化的数据段,就像全局变量。

0

使用此: -

int i=10,j=1; 
int main() 
{ 
    printf("%d",j); 
} 

虽然这是一个很小的变化,但它的工作