static关键字详解

对于static关键字,从学C语言来就一直没理清过,究其原因还是因为网络很多的帖子只是列举了static的各种用法,并没有说明原因,导致压根记不住。最近研读了《c和指针》,才终于算是搞清楚了static,不由得感慨一句:经典终归是经典啊。

首先需要明白两个概念:标识符的链接属性和变量的存储类型。

标识符就是程序中各种元素的名称,所以变量、函数这些都是标识符。标识符有三种连接属性: external(外部)、internal(内部)和 none(无)。

具有external链接属性的标识符,在本项目的所有源文件中都表示一个实体。在程序块外部定义的变量缺省就是external属性,所以其他源文件内就不可以在定义与之同名的变量,但是可以使external关键字来获得这个实体变量。

具有internal链接属性的标识符在同一源文件的所有声明都指向同一实体、在不同源文件的多个声明则分属于不同实体。

具有none链接属性的标识符总是被当作独立不同的实体。像在代码块中定义的变量缺省就是none。

链接属性介绍完了,在介绍存储类型之前,开始今天的主角了,static关键字在链接属性中的作用是什么
答:static关键字可以把具有 external链接属性的变量改为 internal链接属性。这也是具有internal链接属性变量的唯一来源。

但是值得注意的是:static只对缺省链接属性为external的声明才具有改变链接属性的作用,而缺省链接属性为external一般都是定义在代码块之外的全局变量、函数等,所以在全局变量、函数等的前面加上static的作用就是将其链接属性由external改为internal,就可以使该全局变量、函数只在本文件中使用,为本文件私有,其他源文件可以以定义同名的变量和函数了。这种技巧也被称为“防止污染命名空间”。

好了,让我们继续介绍另一个概念:存储类型。
存储类型有三类:静态(static)、自动(auto)、寄存器
(register)。

声明在代码块之外的变量默认就是静态存储类型,在程序运行之前创建,整个程序执行期间都存在。在代码块内部声明的变量缺省是自动存储类型,存放在堆栈中,执行到声明语句才被创建,程序运行到代码块之外就销毁。

寄存器存储类型就是用register关键字声明的,在硬件寄存器中处理的变量,用得较少不过多介绍。
在存储类型中,static关键字的作用就是把自动存储类型的、在代码块内部声明的变量改变为静态存储类型,使其整个程序执行期间都存在。


勘误∶
当全局变量使用const修饰时,也会将其缺省的external连接属性修改为internal,只能在本文件中使用。想要使其在其他文件也可使用,就必须在定义的时候加上extern关键字了

extern const int a = 1;#c语言学习#
全部评论

相关推荐

5 21 评论
分享
牛客网
牛客企业服务