静态和外部变量

fud*_*din 4 c

静态变量和外部变量之间有什么区别?制作静态变量有什么好处?为什么我们更喜欢在多功能程序中创建外部变量?这本书说,其他它很晚才被初始化.我不明白.

Pat*_*ick 25

问题是在C静态中可以有不同的含义.我将尝试在以下段落中概述不同的情况.

如果在函数外部定义变量,则可以由文件中的所有函数使用它.有时也称为"全局变量".这意味着整个文件只有一个这个变量的实例.此外,变量的名称存储在生成的.OBJ文件中.后者很重要,因为如果另一个文件还定义了一个在函数外部具有相同名称的变量,则链接器假定它在两种情况下都是相同的变量,并将它们合并.为了使此更清楚,最好将关键字"extern"添加到其中一个变量中.在这种情况下,我们说我们声明变量,而不是定义它.这是编译器/链接器的额外信号,表明我们实际上想要引用在其他地方定义的全局变量.

如果要定义全局变量,但不希望将其用于其他文件,请先添加关键字static.关键字static告诉编译器变量名不能存储在.OBJ文件中.这意味着两个.C文件包含以下行:

static long MyGlobalVariable;
Run Code Online (Sandbox Code Playgroud)

每个都有自己的变量.这两个变量都将被称为MyGlobalVariable.

如果在函数内定义变量,它将成为局部变量.它在调用函数时出现,并在函数完成后再次消失.在某些情况下,您希望在函数调用之间保留变量的值.您可以通过使用全局变量(而不是局部变量)来执行此操作,但随后该变量可用于文件中的所有函数,您不一定需要这些函数.在这种情况下,您可以在变量之前放置关键字static,如下所示:

void MyFunction()
{
static long MyLocalVariable = 0;
++MyLocalVariable;
}
Run Code Online (Sandbox Code Playgroud)

第一次调用该函数时,MyLocalVariable将被"创建"并初始化为值0.在函数结束时,变量不会被销毁,而是保留.因此,下次调用此函数时,变量的值将为1,而不是零.

在C中,将变量放在函数外部(作为全局变量)或在函数内部将其定义为静态并不重要.唯一的区别是可以访问变量的位置.

在C++中,事情是完全不同的.如果你写这个(在函数之外):

MyClass MyGlobalVariable;
Run Code Online (Sandbox Code Playgroud)

在应用程序启动之前,甚至在调用main之前,将构造MyGlobalVariable(这是:构造函数将被执行).但是,您无法真正控制构造所有全局变量的顺序.所以如果另一个文件包含这个:

MyOtherClass MySecondGlobalVariable;
Run Code Online (Sandbox Code Playgroud)

您无法确定是否首先构造了MyGlobalVariable或MySecondGlobalVariable.如果其中一个的构造函数依赖于另一个的存在(构造),则会产生问题.

另一方面,如果在函数内部将变量定义为static:

void MyFunction()
{
static MyClass MyStaticVariable;
}
Run Code Online (Sandbox Code Playgroud)

然后在第一次调用函数时构造MyStaticVariable.有了这种结构,你可以这样写:

MyClass &getMyClass()
{
static MyClass MySelf;
return MySelf;
}
Run Code Online (Sandbox Code Playgroud)

我们已经实现了一个单例,我们可以控制它何时构建.我们第一次需要它,它是构建的.

说实话,这种方法相当简单,因为它可能会导致多线程应用程序出现问题.在这种情况下,还有其他技巧.