性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

C語言之 static

先總結一下 static 的用法,然后再對每一條進行說明:

  1. 定義全局靜態(tài)變量

  2. 定義局部靜態(tài)變量

  3. 定義靜態(tài)函數(shù)

  4. 頭文件中使用

前面三個應該是很常見的,簡要說明即可,重要的是后面那一個不常見,作為重點講解內容。

首先是全局靜態(tài)變量,看這名字就知道,這個變量有兩個屬性(姑且就稱之為屬性吧),第一:這個變量是全局的,也就是說這個變量可以在源文件的任何一個函數(shù)中使用,并且始終存在。第二:這個函數(shù)是靜態(tài)的,本來嘛,全局變量已經是能夠一直存在,你加一個靜態(tài)屬性什么意思?靜態(tài),就是說你只能在本文件調用,其他文件調用是不行的,即使你用 extern 聲明也不行,如果真這么做,這就是下場:

然后是局部靜態(tài)變量,“局部”說明這個變量只能在本函數(shù)被使用,出了函數(shù)范圍內我是不管用的,另外,即使這個函數(shù)調用了其他函數(shù),而其他函數(shù)也要用這個變量,不好意思,我的手沒那么長,夠不著,我就守著我這巴掌大的地方,所以說其他函數(shù)也不能使用這個變量。這個和局部變量的性質是一樣的,但是這里又加了一個屬性:靜態(tài),這就意味著這個變量可以始終存在,不會說函數(shù)調用完了,我就不存在了。

這兩種變量能始終存在就是因為編譯器將這兩種變量和全局變量放在一個內存區(qū)域了。

靜態(tài)函數(shù):函數(shù)體是始終存在的,但是這里加了一個 static 什么意思,肯定不是讓它始終存在,而是限制它的作用域。我們知道一個函數(shù)是可以被其他文件的函數(shù)調用的,但是現(xiàn)在加了這靜態(tài)屬性就不行了,這個函數(shù)只能被這個文件的函數(shù)調用,其他文件的函數(shù)是無法調用的,也正因為如此,所以其他文件也可以使用相同的函數(shù)名而不怕重復定義了,同理,全局靜態(tài)變量和局部靜態(tài)變量也是如此。全局靜態(tài)變量的話,可以在多個文件中定義同一個函數(shù)名,但實際他們的內存是不一樣的,可以放心使用。

而局部靜態(tài)變量作用域被限定在一個函數(shù)里面,離開了這個函數(shù)別人就不認得它了,所以可以在同一個文件下的不同函數(shù)中定義相同的變量名,當然在不同文件下亦是如此。

通過圖理解一下:

這里的 num 就是全局靜態(tài)變量,而 temp 是局部靜態(tài)變量,而函數(shù) fun1 和 fun2 在同一文件中,所以變量名必須不同,但是在不同文件下,又可以繼續(xù)使用 fun1 和 fun2 函數(shù)名了。

說完常見的,現(xiàn)在來看看不常見的。

如果在頭文件中使用 static 會發(fā)生什么情況呢?

第一次看到 static 在頭文件使用的時候是和 inline 一起使用的,所以在頭文件的聲明為一個內聯(lián)函數(shù)。

本來一個內聯(lián)函數(shù)放在頭文件中申明為 inline 就可以了,為什么還要加上 static 呢?

這是為了在不同文件中使用 include 包含頭文件時能夠產生不同的實體,這樣就不會出現(xiàn)重復定義的情況了。

同理,如果你在頭文件中用 static 申明一個變量,那么每次使用 include 包含這個頭文件的時候都會產生一個變量,雖然它們的名字相同,但是它們內存位置卻是不同的,比如張三這個名字,雖然都叫張三,但可能他們不是同一個人,所做的一些行為也就不一樣了。

可以看到,我在 delay.h 中定義了一個 delay_time 的變量,在 main.c 和 usart1.c 兩個文件中使用 include 包含這個 delay.h 文件,通過編譯的 .map 文件可以看到,每一個文件下都有一個 delay_time,雖然名字一樣,但是地址卻不一樣,一個是 0x20000000,另一是 0x20000010,所以它們是不同的變量。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 160
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧