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)
我们已经实现了一个单例,我们可以控制它何时构建.我们第一次需要它,它是构建的.
说实话,这种方法相当简单,因为它可能会导致多线程应用程序出现问题.在这种情况下,还有其他技巧.
| 归档时间: |
|
| 查看次数: |
11117 次 |
| 最近记录: |