static关键字

来源:互联网 发布:庆应大学知乎 编辑:程序博客网 时间:2024/06/12 13:49

static关键字

变量具有三个属性--作用域、链接属性和存储类型。这3个属性决定了一个变量的可视性(它可以在什么地方使用)和生命期(它的值将保存多久)。

在介绍static关键字之前,先说一下链接属性和存储类型。

1.链接属性

       当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或者多个函数库中引用的函数链接在一起,形成可执行程序。然而,如果相同的标志符出现在几个不同的源文件中时,应该怎样处理?标志符的链接属性决定如何处理不同文件中出现的标志符。标志符的作用域和它的链接属性有关,但这两个属性不相同。

       链接属性一共有3种:external,internal,none.没有链接属性的标志符总是被当作单独的个体,也就是说该标志符的多个声明被当作独立不同的实体。属于internal链接属性的标志符在同一个源文件内的所有声明中都指向同一个实体,但位于不同源文件的多个声明则属于不同的实体。属于external的链接属性的标志符不论声明多少次、位于几个源文件都表示同一个实体。

typedef char *a;int b;int c(int d){    int e;    int  f(int g);}
在缺省的情况下,标志符b,c,f的链接属性为external,其余标志符的链接属性则为none。因此,如果另一个源文件包含了标志符b的类似声明并调用函数c,它们实际上访问的是这个源文件所定义的实体。f的链接属性之所以是external是因为它是个函数名。在这个源文件中调用函数f,它实际上将链接到其他文件所定义的函数。甚至这个函数的定义可能出现在某个函数库中。

       关键字extern和static用于在声明中修改标志符的链接属性。如static int b;那么变量b就将为这个源文件所私有。在其他源文件中,如果也链接到一个叫b的变量,那么它所引用的是另外一个变量。static itn c(int d);这课防止它被其他源文件调用。static 只对缺省链接属性为external的声明才有链接属性的效果。

2.存储类型

    变量的存储类型指的是存储变量值的内存类型。变量的内存类型决定变量何时创建、何时销毁以及他的值将保持多久。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。

    静态变量(static):凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存。静态变量在程序运行之前创建,在程序的整个执行期间始终存在。

   自动(auto)变量:在代码块内部声明的变量的缺省存储类型是自动的,也就是说它存储于堆栈中。对于在代码块内部声明的变量,如果给他加上关键字static,可以使他的存储类型从自动变为静态。具有静态存储类型的变量在整个程序执行过程中一直存在。修改变量的存储类型并不表示修改该变量的作用域,它仍然只能在该代码块内部按名字访问。

   寄存器(register)变量:存储在机器的硬件寄存器而不是内存中。

介绍完链接属性和存储类型之后,来看看static关键字。

3.static关键字:

当用于不同的上下文环境时,static关键字具有不同的意思。

1).当它用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标志符的链接属性,从external改为internal,但标志符的存储类型和作用域不受影响。用于这种方式声明的函数或者变量只能在声明它们的源文件中访问。

2).当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在。

原创粉丝点击