为什么初始化一个全局变量,函数的返回值在声明时失败,但在文件范围内工作正常?

Rüp*_*ure 7 c initialization constants global-variables

一个80k信誉贡献者R.,跟我上,使我们无法与函数的返回值初始化全局变量,这不是被认为是恒定的,和全局变量必须用他的话一constant.And真正的初始化,我得到正如预期的那样,该程序出现以下错误 - .这initializer element is not a constant是程序:

#include<stdio.h>
int foo();
int gvar=foo();  //ERROR

int main()
{
printf("%d",gvar);
}

int foo()
{
 return 8;
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我只是不明白为什么上面程序的后续更改版本根本没有显示任何错误并且工作正常.在第二个程序中,我使用相同函数的返回值初始化相同的全局变量foo().你能告诉我这种结果变化的严格技术原因是什么?为什么用函数的返回值初始化全局变量会导致错误,但同样的返回值初始化工作正常功能?

#include<stdio.h>
int foo();
int gvar;

int main()
{
gvar=foo();
printf("%d",gvar);
}

int foo()
{
return 8;
}
Run Code Online (Sandbox Code Playgroud)

产量 8

das*_*ght 12

其背后的原因是,为了确定函数产生的值,需要执行代码,并且在初始化静态和全局变量时,在C中没有完成代码执行.

编译器和链接器协同工作以准备全局内存段的字节映像:编译器提供值,链接器执行其最终布局.在运行时,段的图像按原样加载到存储器中,无需进一步修改.这在任何代码执行之前发生,因此不能进行任何函数调用.

请注意,这并不意味着由于某些技术原因不可能,只有C设计者决定不这样做.例如,C++编译器生成一个代码段,该代码段调用全局对象的构造函数,该代码段在控件传递给main()之前执行.


Mat*_*Mat 6

第二个版本没有 的初始化程序gvargvar在全局范围内声明和定义,无需初始值设定项。它具有静态存储持续时间,因此它被初始化为零。

中的赋值main只是:赋值,而不是初始化。