静态和外部变量

问题描述:

静态和外部变量之间有什么区别?做一个静态变量有什么好处? 为什么我们更喜欢在多功能程序中创建外部变量?这本书说,否则它很早就被初始化了。我不明白。静态和外部变量

+3

C#和C++是非常不同的语言。由于“外部”变量的概念在C#中不存在,我假设这是关于C++的。 – 2010-07-01 19:33:17

+2

你也指哪本书?知道名称/国际标准书号来清除你的问题会很方便(页面也很方便)。 – XIII 2010-07-01 19:34:15

+0

让我们通过yashwant kanetkar 和turbo c通过robert lafore – 2010-07-01 19:36:01

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

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

如果你想定义一个全局变量,但不想让它可用于其他文件,请在之前添加关键字static。关键字static告诉编译器,变量名不能存储在.OBJ文件中。这意味着两个.C文件具有以下行:

static long MyGlobalVariable; 

将分别具有自己的变量。这两个变量将被称为MyGlobalVariable。

如果你在一个函数中定义了一个变量,它将变成一个局部变量。如果函数被调用,它就会存在,并在函数完成后再次消失。 在某些情况下,您希望在函数调用之间保留变量的值。您可以通过使用全局变量(而不是局部变量)来完成此操作,但是该变量可用于文件中的所有函数,您不一定需要该函数。在这种情况下,你可以把关键字static变量之前,像这样:

void MyFunction() 
{ 
static long MyLocalVariable = 0; 
++MyLocalVariable; 
} 

第一次调用函数时,MyLocalVariable将“创造”,并与值0初始化在函数结束,变量不被破坏,但保持不变。因此,下次您调用此函数时,变量的值将为1,而不是零。

在C中,将函数外部的变量(作为全局变量)还是将其定义为静态函数并不重要。唯一的区别是变量可以被访问的地方。

在C++中,情况完全不同。如果你写这个(在函数外):

MyClass MyGlobalVariable; 

MyGlobalVariable将建造(这就是:构造函数将被执行),在应用程序开始之前,甚至主要被调用。但是,您无法真正控制所有全局变量的构建顺序。 因此,如果另一个文件包含此:

MyOtherClass MySecondGlobalVariable; 

你无法知道自己是否MyGlobalVariable或MySecondGlobalVariable首先构造。如果其中一个的构造函数依赖于另一个的存在(构造),那么这会产生问题。

在另一方面,如果你定义的变量作为函数内部静态:

void MyFunction() 
{ 
static MyClass MyStaticVariable; 
} 

然后MyStaticVariable将建造第一次函数被调用。利用这种结构,你可以写这样的事情:

MyClass &getMyClass() 
{ 
static MyClass MySelf; 
return MySelf; 
} 

我们已经实现了一个单,我们有构造时,它的控制。我们第一次需要它时,它就被构建了。

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

+0

这个问题现在只被标记为C. – 2010-07-01 19:58:36

+0

关于你给出的例子,如果我重新启动程序,第一行是静态的long MyLocalVariable = 0; 它的值为0.那么它的值是1呢? – 2010-07-01 20:24:29

+0

在++ ++ MyLocalVariable行之后,它的值将为1.如果稍后再次输入函数,值将仍为1,并且在++ ++ MyLocalVariable之后,值将为2.依此类推。重要的是要看到初始化为零仅在第一次输入函数时(或者更确切地说,在变量被构建的那一刻)执行。 – Patrick 2010-07-01 20:47:00

“静态”或多或少意味着“这将永远存在”。根据上下文,你会得到不同的结果:

static int global_variable; 
void function() 
{ 
     static int global_function_variable; 
} 

class foo 
{ 
     static void function() 
     { 
      static int foo_function_variable; 
      //... 
     } 
     static int foo_variable; 
} 

global_variable - 只有“翻译单位”内才可见。 (由于头都或多或少复制的,这是否意味着在头一个静态全局存在为它包含在所有的cpp文件不同的变量?)

global_function_variable创建第一次function被调用,并且将继续贯穿整个项目的整个生命周期。值仍然存在,所以如果您在一次函数调用中更改它,则下一次函数调用将使用更改后的变量。

foo::function()是一个可以像全局函数一样调用的函数;你不需要有一个foo的实例来调用它。这意味着它没有有效的this指针,但是。同样,即使没有任何foo对象,foo_variable也存在。所有foo对象具有相同的foo_variable - 如果您在一个对象中更改它,则所有其他对象都会“看到”更改。

foo_function_variable行为,我想,就像global_function_variable

背后extern的基本思想是控制变量的起重: 从MSDN

// specifying_linkage1.cpp 
int i = 1; 
void other(); 

int main() { 
    // Reference to i, defined above: 
    extern int i; 
} 

void other() { 
    // Address of global i assigned to pointer variable: 
    static int *external_i = &i; 

    // i will be redefined; global i no longer visible: 
    // int i = 16; 
} 

extern int global_variable; 

extern也可以使用利用另一种语言,最常见的一种可变链接,C.

global_variable是extern最常用的用法;它说其他地方有一个名为“global_variable”的变量,我们将使用该变量。在某处,您需要声明变量而不使用关键字extern,否则它永远不会被创建。

+1

那些downvote请评论为什么? – Narfanator 2015-12-16 20:32:09