使用非常量初始化程序定义全局变量

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

我得到一个错误,说明初始化元素不是常量? 这背后的原因是什么?

这背后的原因是什么?

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

C99标准:第6.7.8节:

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

您可以尝试使用:

 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节中:

标识符使用外部或内部链接声明的对象,或者使用存储类说明符static声明的对象具有静态存储持续时间。 它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。

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

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

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

显然,这种限制的原因是聚合初始化器应该在预初始化的数据段中提前构建,就像全局变量一样。

用这个:-

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

虽然这是一个小小的改变,但它会起作用