下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、c語言中extern關(guān)鍵字詳解作者:華清遠(yuǎn)見武漢華嵌 技術(shù)支持 曹偉東內(nèi)容清單:1. 用extern聲明外部變量(1)在一個文件內(nèi)聲明的外部變量(2)在多個文件中聲明外部變量(3)在多個文件中聲明外部結(jié)構(gòu)體變量2. 用extern聲明外部函數(shù)3. 總結(jié)1 用extern聲明外部變量定義:外部變量是指在函數(shù)或者文件外部定義的全局變量。外部變量定義必須在所有的函數(shù)之外,且只能定義一次。(1) 在一個文件內(nèi)聲明的外部變量作用域:如果在變量定義之前要使用該變量,則在用之前加extern聲明變量,作用域擴(kuò)展到從聲明開始,到本文件結(jié)束。例子:#include int max(int x,int y); /
2、函數(shù)提前聲明int main(int argc,char *argv ) int result;extern int x; /外部變量聲明extern int y; result = max(x,y); printf(the max value is %dn,result); return 0;int x = 10; /定義外部變量int y = 20;int max(int x, int y) return (xy ? x : y);其中,用extern聲明外部變量時,類型名可以省略。例如,“extern int x;”,可以改寫成“extern x;”。 小結(jié):這種用方法簡單,實用性不大。
3、(2) 在多個文件中聲明外部變量作用域:如果整個工程由多個文件組成,在一個文件中想引用另外一個文件中已經(jīng)定義的外部變量時,則只需在引用變量的文件中用extern關(guān)鍵字加以聲明即可??梢姡渥饔糜驈囊粋€文件擴(kuò)展到多個文件了。例子:文件a.c的內(nèi)容:#include int base=2;/變量定義int exe(int x); /外部函數(shù)提前聲明int main(int argc, char *agrv) int a=10; printf(%d%d = %dn,base,a,exe(a); return 0;文件b.c的內(nèi)容:#include extern base;/外部變量聲明int exe
4、(int x) int i; int ret=1; for(i=0;ix;i+) ret*=base; return ret;利用gcc工具編譯gcc a.c b.c o demo,再運(yùn)行./demo,結(jié)果為210 = 1024。其中,在a.c文件中定義base=2,在b.c中引用base時,需要用extern關(guān)鍵字聲明其為外部變量,否則編譯會找不到該變量。 小結(jié):對于多個文件的工程,可以采用這種方法來操作。實際工程中,對于模塊化的程序文件,在其文件中可以預(yù)先留好外部變量的接口,也就是只采用extern聲明變量,不定義變量,也通常在模塊程序的頭文件中聲明,在使用該模塊時,只需要在使用時定義一下
5、即可,如上述b.c文件,做好相應(yīng)的函數(shù)接口,留好需要改變base值的聲明,在需要使用該模塊時,只需要在調(diào)用的文件中定義具體的值即可。引用外部變量和通過函數(shù)形參值傳遞變量的區(qū)別:用extern引用外部變量,可以在引用的模塊內(nèi)修改其值,而形參值傳遞的變量則不能修改其值,除非是地址傳遞。因此,如果多個文件同時對需要應(yīng)用的的變量進(jìn)行同時操作,可能會修改該變量,類似于形參的地址傳遞,從而影響其他模塊的使用,因此,要慎重使用。(3) 在多個文件中聲明外部結(jié)構(gòu)體變量前面一節(jié)中,只是適合一般變量的外部聲明,但是對于聲明外部結(jié)構(gòu)體變量時,則有些不同,需要加以注意。例子:文件a.c的內(nèi)容:#include #in
6、clude b.h#include c.ha_class local_post=1,2,3; /全局變量a_class next_post=10,9,8; /全局變量int main(int argc,char *argv) a_class ret; print(first point,local_post); print(second point,next_post); ret=fun(local_post,next_post); printf(the vector is (%d,%d,%d)n,ret.x,ret.y,ret.z); return 0;文件b.h的內(nèi)容:#ifndef _b
7、_h#define _b_h#if1typedef struct int x; int y; int z;a_class;#endifextern a_class local_post;/外部結(jié)構(gòu)體變量聲明extern a_class fun(int x,int y,int z);/接口函數(shù)聲明#endif文件b.c的內(nèi)容:#include #include b.ha_class fun(a_class first,a_class next) a_class ret; ret.x=next.x-first.x; ret.y=next.y-first.x; ret.z=next.z-first.
8、z; return (ret);文件c.h的內(nèi)容:#ifndef _c_h#define _c_hextern int print(char *,a_class post);#endif文件c.c的內(nèi)容:#include #include b.hint print(char *str,a_class post) printf(%s : (%d,%d,%d)n,str,post.x,post.y,post.z); return 0;利用gcc工具編譯gcc a.c b.c c.co demo,再運(yùn)行./demo,結(jié)果為first point : (1,2,3)second point : (10
9、,9,8)the vector is (9,8,5)小結(jié):在a.c文件中定義全局變量a_class local_post結(jié)構(gòu)體,并且調(diào)用b.c中的接口函數(shù)a_class fun(int x,int y,int z)和c.c中int print(char *str,a_class post),在b.h中聲明外部結(jié)構(gòu)體變量local_post,同時,需要對其類型a_class進(jìn)行實現(xiàn),在b.h文件中,如果屏蔽掉a_class的實現(xiàn),而在b.h以外的文件中實現(xiàn),此時編譯時就會出錯,由于c.c文件中用到a_class定義的類型,所以需要在該文件中包含b.h。這里需要說明的是,如果調(diào)用外部結(jié)構(gòu)體等多層結(jié)
10、構(gòu)體變量時,需要對這種變量進(jìn)行實現(xiàn),使用時,加上模塊的頭文件即可,否則會報錯。實際工程中,模塊化程序文件,一般提供一個.c和一個.h文件,其中.h文件被.c文件調(diào)用,.h文件中實現(xiàn)。2 用extern聲明外部函數(shù)a 定義函數(shù)時,在函數(shù)返回值類型前面加上extern關(guān)鍵字,表示此函數(shù)時外部函數(shù),可供其他文件調(diào)用,如extern int func (int x,int y),c語言規(guī)定,此時extern可以省略,隱形為外部函數(shù)。b 調(diào)用此函數(shù)時,需要用extern對函數(shù)作出聲明。作用域:使用extern聲明能夠在一個文件中調(diào)用其他文件的函數(shù),即把被調(diào)用函數(shù)的作用域擴(kuò)展到本文件。c語言中規(guī)定,聲明時
11、可以省略extern。例子:文件a.c的內(nèi)容:#include #include b.hint main() int x=10,y=5; printf(x = 10,y = 5n); printf(x + y = %dn,add(x,y); printf(x - y = %dn,sub(x,y); printf(x * y = %dn,mult(x,y); printf(x / y = %dn,div(x,y); return 0;文件b.h的內(nèi)容:#ifndef _f_h#define _f_hextern int add(int x,int y);extern int sub(int x,
12、int y);extern int mult(int x,int y);extern int div(int x,int y);#endif文件b.c的內(nèi)容:#include int add(int x,int y) return(x+y);int sub(int x,int y) return(x-y);int mult(int x,int y) return(x*y);int div(int x,int y) if(y!=0) return(x/y); printf(mult() fail!the second para can not be zero!n ); return(-1);利用gcc工具編譯gcc a.c b.c o demo,再運(yùn)行./demo,結(jié)果為x = 10,y = 5x + y = 15x - y = 5x * y = 50x / y = 2。小結(jié):由上面簡單的例子可以看出,在b.h文件中聲明好b.c的函數(shù),使用時,只需要在a.c中包含#include “b.h”頭文件即可,這樣就可以使用b.c的接口函數(shù)了,在實際工程中,通常也是采用這種方式,.c文件中實現(xiàn)函數(shù),.h文件中聲明函數(shù)借口,需要調(diào)用.c文件的函數(shù)接口時,只需包含.h頭文件即可。3. 總結(jié)在實際工程中,有兩種情況比較多。一是利用extern只聲明外
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育行業(yè)職工代表大會實施細(xì)則
- 建筑供游泳館人工費(fèi)施工合同
- 文化遺產(chǎn)保護(hù)項目施工合同
- 藥品配送服務(wù)改進(jìn)
- 幼兒園監(jiān)控系統(tǒng)電工聘用
- 教育訪問簽證辦理流程
- 培訓(xùn)機(jī)構(gòu)短期電腦租賃協(xié)議
- 家庭教育顧問招聘協(xié)議
- 醫(yī)院實習(xí)生培訓(xùn)合同
- 智能影院監(jiān)控施工合同
- icao專業(yè)詞匯民航
- 如何利用記賬改善你企業(yè)
- 藥物化學(xué)習(xí)題答案
- 污水源熱泵系統(tǒng)設(shè)計方案
- 校本課程——中外名著閱讀
- 第2章現(xiàn)金流量與資金的時間價值
- 低空飛行基地項目可行性研究報告寫作參考范文
- 知法懂法守法主題班會課件
- 2018年人教版九年級英語單詞表
- 成語故事課件一諾千金
- 物業(yè)公司環(huán)境因素清單
評論
0/150
提交評論