Static、extern關(guan)鍵字的用法
時間:2019-05-30 來源:華清遠見
c語(yu)言中,關鍵(jian)(jian)之比較多,其中static和extern兩個關鍵(jian)(jian)字(zi)使用(yong)(yong)較多,使用(yong)(yong)靈活(huo),本文就(jiu)兩個關鍵(jian)(jian)字(zi)在使用(yong)(yong)的進行總結,不(bu)足之處,請不(bu)吝指正(zheng)。
在程序中使用static一(yi)般修飾(shi)變量,函(han)數。
1. 修飾局部變量
普通局部(bu)變(bian)量(liang)是(shi)在函(han)數(shu)內部(bu)定(ding)義的變(bian)量(liang)(不加static修(xiu)飾(shi)符)。編(bian)譯(yi)器一般(ban)不對普通局部(bu)變(bian)量(liang)進行初(chu)始化,也就(jiu)是(shi)說它的值在初(chu)始時是(shi)不確定(ding)的,除非對其顯式賦值。
普通局部(bu)變(bian)量存儲于進程棧空間,使用完畢會立即釋放(fang)。
靜(jing)態局部(bu)(bu)變量使(shi)用static修(xiu)飾符定義(yi),即使(shi)在聲明時(shi)未賦初(chu)值,編譯器(qi)也會把(ba)它(ta)初(chu)始化為0。且靜(jing)態局部(bu)(bu)變量存(cun)儲于進(jin)程的全(quan)局數據區,即使(shi)函數返回,它(ta)的值也會保持不變。
變量在(zai)全(quan)局數(shu)據區分配內存空(kong)間;編譯(yi)器自動對其初始化
其作用(yong)(yong)域為局部(bu)作用(yong)(yong)域,當定義它的函數結(jie)束(shu)(shu)時,其作用(yong)(yong)域隨之結(jie)束(shu)(shu)
2. 修飾全局變量
全局變量(liang)定義在函數體外部(bu),在全局數據區分配存儲空(kong)間,且編譯(yi)器會(hui)自(zi)動對其初始化。
普(pu)通全局變量對整個(ge)工程可(ke)見,其他文件(jian)(jian)可(ke)以使用(yong)extern外部聲明后(hou)直接使用(yong)。也就是(shi)說其他文件(jian)(jian)不(bu)能再定義一(yi)個(ge)與其相同名字的變量了(否則編譯器會認為它們是(shi)同一(yi)個(ge)變量)。
靜態全局變(bian)量僅對(dui)當前文件可(ke)(ke)見(jian),其他文件不可(ke)(ke)訪問,其他文件可(ke)(ke)以定義與(yu)其同名(ming)的變(bian)量,兩者互不影響。
在(zai)定義不(bu)需要與其他文(wen)件(jian)共享的全局變(bian)量時,加上static關鍵字能夠有效(xiao)地降低(di)程序(xu)模(mo)塊之(zhi)間的耦合,避免不(bu)同文(wen)件(jian)同名(ming)變(bian)量的沖(chong)突,且不(bu)會誤使用(yong)。
3.修飾函數
函數(shu)的使(shi)用(yong)方(fang)式與全局(ju)變量(liang)類似,在函數(shu)的返回類型前加上(shang)static,就是靜態(tai)函數(shu)。其特(te)性(xing)如下:
靜態函(han)數只能(neng)在(zai)聲(sheng)明它的(de)文件中可見,其他文件不能(neng)引(yin)用(yong)該函(han)數
不(bu)(bu)同的文件(jian)可(ke)以使(shi)用相同名(ming)字的靜態函數,互不(bu)(bu)影響
非靜態函數可以在(zai)另一個文(wen)件中直接引用,甚至不(bu)必(bi)使用extern聲明
Extern關鍵字:
1、函(han)(han)數的(de)聲(sheng)明extern關鍵詞是(shi)可有可無(wu)的(de),因為(wei)函(han)(han)數本身不(bu)加修(xiu)飾的(de)話就是(shi)extern。但是(shi)引用的(de)時候(hou)一樣需要聲(sheng)明的(de)。
2、全局(ju)變(bian)(bian)量(liang)在(zai)(zai)外部使用聲明時(shi),extern關鍵字是必須的(de)(de)(de),如果(guo)變(bian)(bian)量(liang)沒(mei)有(you)extern修飾(shi)且(qie)沒(mei)有(you)顯式的(de)(de)(de)初始化(hua)(hua),同(tong)樣成(cheng)為變(bian)(bian)量(liang)的(de)(de)(de)定義(yi),因此(ci)此(ci)時(shi)必須加extern,而(er)編譯器在(zai)(zai)此(ci)標記存儲空間(jian)在(zai)(zai)執行時(shi)加載內并初始化(hua)(hua)為0。而(er)局(ju)部變(bian)(bian)量(liang)的(de)(de)(de)聲明不能(neng)有(you)extern的(de)(de)(de)修飾(shi),且(qie)局(ju)部變(bian)(bian)量(liang)在(zai)(zai)運(yun)行時(shi)才在(zai)(zai)堆棧部分分配(pei)內存。
3、全局變(bian)(bian)量(liang)或函數(shu)本質上(shang)講沒有區別(bie),函數(shu)名是指向函數(shu)二進制塊(kuai)開頭處的指針。而全局變(bian)(bian)量(liang)是在函數(shu)外部聲(sheng)明(ming)的變(bian)(bian)量(liang)。函數(shu)名也在函數(shu)外,因此函數(shu)也是全局的

