首先,我们知道static和extern这两个都是C语言中的关键字。

static是静态的意思,它可以用来修饰局部变量和全局变量,也可以用来修饰函数。

而extern是用来声明外部符号的。

在讲解static和extern之前,我们再讲一下:作用域和生命周期。

作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域;局部变量的作用域是变量所在的局部范围;全局变量的作用域是整个工程。

下面将用一段代码来说明:

1.

这里我们想把m在1处的值和在2处的值同时打印在屏幕上,但这里显示2处未定义标识符m,这是为什么呢?因为m所给定的是最里面小括号的一个变量,它是一个局部变量。

我们再看这段代码:

同为局部变量,那这段代码为什么这段代码能正常打印,而上段代码却无法编译运行呢?这是因为上面的代码将变量m锁定在最里面的小括号内了,而这里我们将变量m放置在了main函数下面的大括号里面了,所以它的范围被扩大了,因此就能够在屏幕上显示出来;

如果我们放入全局变量中呢?

毋庸置疑,依旧能打印在屏幕上;因为当局部变量和全局变量同名的时候,局部变量优先使用。

我们可以假想最里面的小括号内的是自己家的一辆小轿车,而main函数下面的大括号内部的是爷爷留下来的遗产,亲戚和自己家的均可以使用,全局变量则是公用的出租车,大家都可以乘坐。

这里我们再把全局变量和局部变量复习一下:

1.全局变量:在大括号部定义的变量就是全局变量,全局变量的范围使用更广,整个工程中想使用,都是有办法使用的。

2.局部变量:在大括号部定义的变量就是局部变量;局部变量的使用范围比较局限,只能在自己所在的局部范围内使用。

以上就是对于作用域以及全局变量和局部变量用法的一些描述,下面来对生命周期进行讲解:

生命周期是指变量的创建到变量的销毁之间的一个时间段,也是申请内存收回内存的一个时间段。

局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域时生命周期结束。

全局变量的生命周期是:整个程序的生命周期。也是main函数的生命周期,它是从main函数的第一行开始到结束。

下面来讲述一下static修饰局部变量:

这段代码的意思是局部变量u是每次在进入test函数先创建变量并赋值为0,这意味着生命周期开始,然后++,再进行打印,出函数的时候变量生命周期将要结束,这时候释放内存。因此每次在进入test函数的时候,先把0赋值给u,然后++,打印在屏幕上,结果为1,在出函数的时候释放内存,生命周期结束;循环五次,结果均为1

再看这段代码,与上一段代码相比,函数体内的int前面多了一个static,这里我们输出结果来看,u的值具有累加的效果,其实test函数中的u创建好后,由于static关键字修饰局部变量,会延长局部变量的生命周期,函数调用结束它并不会被销毁,重新进入函数也就不会重新创建变量,直接上次累计的数值继续计算;因此未来一个变量出了函数之后,我们还想保留值,等下次进入函数继续使用,就可以static修饰。

下面我们来讲一下static修饰全局变量:

我们先看两段代码:

在讲解两段代码区别之前,先说一下extern的用法,它是用来声明外部符号的,如果一个全局的符号在一个文件中定义的,在另一个文件中也想使用,就可以先用extern进行声明后使用。

这里我们发现,第一段正常运行,而第二段代码在编译时发生了链接性的错误,这又是为什么呢?

本质原因是全局变量默认它是具备外部链接属性的,重要的事情说三遍,外部链接属性!外部链接属性!外部链接属性!所以在外部文件中想使用,只要声明一下就可以,但如果全局变量被static修饰之后,他就转换成了内部链接属性,只能在自己源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的。因此,如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现的,就可以使用static修饰。

以上就是对于static和extern的用法,希望能帮到大家。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐