當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Static、extern關(guān)鍵字的用法
c語(yǔ)言中,關(guān)鍵之比較多,其中static和extern兩個(gè)關(guān)鍵字使用較多,使用靈活,本文就兩個(gè)關(guān)鍵字在使用的進(jìn)行總結(jié),不足之處,請(qǐng)不吝指正。
在程序中使用static一般修飾變量,函數(shù)。
1. 修飾局部變量
普通局部變量是在函數(shù)內(nèi)部定義的變量(不加static修飾符)。編譯器一般不對(duì)普通局部變量進(jìn)行初始化,也就是說它的值在初始時(shí)是不確定的,除非對(duì)其顯式賦值。
普通局部變量存儲(chǔ)于進(jìn)程?臻g,使用完畢會(huì)立即釋放。
靜態(tài)局部變量使用static修飾符定義,即使在聲明時(shí)未賦初值,編譯器也會(huì)把它初始化為0。且靜態(tài)局部變量存儲(chǔ)于進(jìn)程的全局?jǐn)?shù)據(jù)區(qū),即使函數(shù)返回,它的值也會(huì)保持不變。
變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存空間;編譯器自動(dòng)對(duì)其初始化
其作用域?yàn)榫植孔饔糜,?dāng)定義它的函數(shù)結(jié)束時(shí),其作用域隨之結(jié)束
2. 修飾全局變量
全局變量定義在函數(shù)體外部,在全局?jǐn)?shù)據(jù)區(qū)分配存儲(chǔ)空間,且編譯器會(huì)自動(dòng)對(duì)其初始化。
普通全局變量對(duì)整個(gè)工程可見,其他文件可以使用extern外部聲明后直接使用。也就是說其他文件不能再定義一個(gè)與其相同名字的變量了(否則編譯器會(huì)認(rèn)為它們是同一個(gè)變量)。
靜態(tài)全局變量?jī)H對(duì)當(dāng)前文件可見,其他文件不可訪問,其他文件可以定義與其同名的變量,兩者互不影響。
在定義不需要與其他文件共享的全局變量時(shí),加上static關(guān)鍵字能夠有效地降低程序模塊之間的耦合,避免不同文件同名變量的沖突,且不會(huì)誤使用。
3.修飾函數(shù)
函數(shù)的使用方式與全局變量類似,在函數(shù)的返回類型前加上static,就是靜態(tài)函數(shù)。其特性如下:
靜態(tài)函數(shù)只能在聲明它的文件中可見,其他文件不能引用該函數(shù)
不同的文件可以使用相同名字的靜態(tài)函數(shù),互不影響
非靜態(tài)函數(shù)可以在另一個(gè)文件中直接引用,甚至不必使用extern聲明
Extern關(guān)鍵字:
1、函數(shù)的聲明extern關(guān)鍵詞是可有可無的,因?yàn)楹瘮?shù)本身不加修飾的話就是extern。但是引用的時(shí)候一樣需要聲明的。
2、全局變量在外部使用聲明時(shí),extern關(guān)鍵字是必須的,如果變量沒有extern修飾且沒有顯式的初始化,同樣成為變量的定義,因此此時(shí)必須加extern,而編譯器在此標(biāo)記存儲(chǔ)空間在執(zhí)行時(shí)加載內(nèi)并初始化為0。而局部變量的聲明不能有extern的修飾,且局部變量在運(yùn)行時(shí)才在堆棧部分分配內(nèi)存。
3、全局變量或函數(shù)本質(zhì)上講沒有區(qū)別,函數(shù)名是指向函數(shù)二進(jìn)制塊開頭處的指針。而全局變量是在函數(shù)外部聲明的變量。函數(shù)名也在函數(shù)外,因此函數(shù)也是全局的