Static
static在C語言中是一個(gè)多義的關(guān)鍵字。
它的含義取決于它的上下文赌髓。
Static關(guān)鍵字一共有三種用途:
- 用于函數(shù)內(nèi)部聲明局部變量。
此時(shí)static關(guān)鍵字的作用是改變局部變量的存儲(chǔ)類型,從自動(dòng)變量修改為靜態(tài)變量警检。也就是說待诅,這個(gè)局部變量不再存儲(chǔ)在堆椞咎梗或者寄存器中了,而是存儲(chǔ)在編譯時(shí)編譯器分配的一個(gè)靜態(tài)空間地址中咱士。這個(gè)變量的作用域沒變立由,只有聲明它的函數(shù)內(nèi)部才能訪問。同時(shí)擁有靜態(tài)變量和局部變量的特征序厉。 - 用于函數(shù)定義锐膜。
此時(shí)這個(gè)函數(shù)就只能在該函數(shù)的C文件中引用了,其他的C文件不能調(diào)用這個(gè)函數(shù)弛房。這種做可以起到封裝的效果道盏,將局部的、私有的函數(shù)或變量聲明為static文捶。 - 用于聲明全局變量荷逞。
與用于函數(shù)類似,這個(gè)全局變量的作用于將局限在聲明該變量的C語言內(nèi)部粹排。
volatile
volatile 關(guān)鍵字告訴編譯器該變量是隨時(shí)可能發(fā)生變化的种远,每次使用它的時(shí)候必須從原內(nèi)存中取出他的值,因而編譯器生成的匯編代碼會(huì)從原內(nèi)存地址中讀取數(shù)據(jù)使用顽耳。
編譯器在優(yōu)化的過程中可能會(huì)把頻繁使用的變量備份一份坠敷,放在CPU內(nèi)部寄存器中,這樣可以快速訪問射富,但是當(dāng)原內(nèi)存地址中的值被修改時(shí)(比如DMA直接修改內(nèi)存中的值)膝迎,CPU內(nèi)部寄存器的值卻沒有修改,這樣就會(huì)產(chǎn)生意想不到的結(jié)果胰耗。這時(shí)就需要使用volatile了限次。
一般來說都會(huì)忘記加volatile,記得加volatile的也是非常了解volatile的柴灯,這里的建議是卖漫,在調(diào)試的時(shí)候遇到了意想不到的結(jié)果是可以嘗試一下添加volatile
volatile一般用在如下的幾個(gè)地方:1费尽、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;2懊亡、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile依啰;3、存儲(chǔ)器映射的硬件寄存器通常也要加volatile說明店枣,因?yàn)槊看螌λ淖x寫都可能由不同意義速警;另外,以上這幾種情況經(jīng)常還要同時(shí)考慮數(shù)據(jù)的完整性(相互關(guān)聯(lián)的幾個(gè)標(biāo)志讀了一半被打斷了重寫)鸯两,在1中可以通過關(guān)中斷來實(shí)現(xiàn)闷旧,2中可以禁止任務(wù)調(diào)度,3中則只能依靠硬件的良好設(shè)計(jì)了钧唐。