C语言之 static_函数调用


先总结一下 static 的用法,然后再对每一条进行说明:



  1. 定义全局静态变量
  2. 定义局部静态变量
  3. 定义静态函数
  4. 头文件中使用

前面三个应该是很常见的,简要说明即可,重要的是后面那一个不常见,作为重点讲解内容。

首先是全局静态变量,看这名字就知道,这个变量有两个属性(姑且就称之为属性吧),第一:这个变量是全局的,也就是说这个变量可以在源文件的任何一个函数中使用,并且始终存在。第二:这个函数是静态的,本来嘛,全局变量已经是能够一直存在,你加一个静态属性什么意思?静态,就是说你只能在本文件调用,其他文件调用是不行的,即使你用 extern 声明也不行,如果真这么做,这就是下场:

C语言之 static_头文件_02

然后是局部静态变量,“局部”说明这个变量只能在本函数被使用,出了函数范围内我是不管用的,另外,即使这个函数调用了其他函数,而其他函数也要用这个变量,不好意思,我的手没那么长,够不着,我就守着我这巴掌大的地方,所以说其他函数也不能使用这个变量。这个和局部变量的性质是一样的,但是这里又加了一个属性:静态,这就意味着这个变量可以始终存在,不会说函数调用完了,我就不存在了。

这两种变量能始终存在就是因为编译器将这两种变量和全局变量放在一个内存区域了。

静态函数:函数体是始终存在的,但是这里加了一个 static 什么意思,肯定不是让它始终存在,而是限制它的作用域。我们知道一个函数是可以被其他文件的函数调用的,但是现在加了这静态属性就不行了,这个函数只能被这个文件的函数调用,其他文件的函数是无法调用的,也正因为如此,所以其他文件也可以使用相同的函数名而不怕重复定义了,同理,全局静态变量和局部静态变量也是如此。全局静态变量的话,可以在多个文件中定义同一个函数名,但实际他们的内存是不一样的,可以放心使用。

C语言之 static_头文件_03

而局部静态变量作用域被限定在一个函数里面,离开了这个函数别人就不认得它了,所以可以在同一个文件下的不同函数中定义相同的变量名,当然在不同文件下亦是如此。

通过图理解一下:

这里的 num 就是全局静态变量,而 temp 是局部静态变量,而函数 fun1 和 fun2 在同一文件中,所以变量名必须不同,但是在不同文件下,又可以继续使用 fun1 和 fun2 函数名了。

说完常见的,现在来看看不常见的。

如果在头文件中使用 static 会发生什么情况呢?

第一次看到 static 在头文件使用的时候是和 inline 一起使用的,所以在头文件的声明为一个内联函数。

C语言之 static_头文件_04

本来一个内联函数放在头文件中申明为 inline 就可以了,为什么还要加上 static 呢?

这是为了在不同文件中使用 include 包含头文件时能够产生不同的实体,这样就不会出现重复定义的情况了。

同理,如果你在头文件中用 static 申明一个变量,那么每次使用 include 包含这个头文件的时候都会产生一个变量,虽然它们的名字相同,但是它们内存位置却是不同的,比如张三这个名字,虽然都叫张三,但可能他们不是同一个人,所做的一些行为也就不一样了。

C语言之 static_头文件_05

C语言之 static_静态变量_06

可以看到,我在 delay.h 中定义了一个 delay_time 的变量,在 main.c 和 usart1.c 两个文件中使用 include 包含这个 delay.h 文件,通过编译的 .map 文件可以看到,每一个文件下都有一个 delay_time,虽然名字一样,但是地址却不一样,一个是 0x20000000,另一是 0x20000010,所以它们是不同的变量。


 

-THE END-



如果觉得文章对你有帮助,欢迎转发、分享给朋友,感谢你的支持!


如果对本文有问题,欢迎留言!即使没有问题也可以留下的神评论C语言之 static_静态变量_07


 


微信公众号「鱼鹰谈单片机

每周一更单片机知识

C语言之 static_头文件_08

长按后识别图中二维码关注