詳解C語言正確使用extern關(guān)鍵字
利用關(guān)鍵字extern,可以在一個文件中引用另一個文件中定義的變量或者函數(shù),下面就結(jié)合具體的實(shí)例,分類說明一下。
一、引用同一個文件中的變量
#include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); }
如果按照這個順序,變量 num在main函數(shù)的后邊進(jìn)行聲明和初始化的話,那么在main函數(shù)中是不能直接引用num這個變量的,因?yàn)楫?dāng)編譯器編譯到這一句話的時候,找不到num這個變量的聲明,但是在func函數(shù)中是可以正常使用,因?yàn)閒unc對num的調(diào)用是發(fā)生在num的聲明和初始化之后。
如果我不想改變num的聲明的位置,但是想在main函數(shù)中直接使用num這個變量,怎么辦呢?可以使用extern這個關(guān)鍵字。像下面這一段代碼,利用extern關(guān)鍵字先聲明一下num變量,告訴編譯器num這個變量是存在的,但是不是在這之前聲明的,你到別的地方找找吧,果然,這樣就可以順利通過編譯啦。但是你要是想欺騙編譯器也是不行的,比如你聲明了extern int num;但是在后面卻沒有真正的給出num變量的聲明,那么編譯器去別的地方找了,但是沒找到還是不行的。
下面的程序就是利用extern關(guān)鍵字,使用在后邊定義的變量。
#include<stdio.h> int func(); int main() { func(); //1 extern int num; printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); }
二、引用另一個文件中的變量
如果extern這個關(guān)鍵字就這點(diǎn)功能,那么這個關(guān)鍵字就顯得多余了,因?yàn)樯线叺某绦蚩梢酝ㄟ^將num變量在main函數(shù)的上邊聲明,使得在main函數(shù)中也可以使用。
extern這個關(guān)鍵字的真正的作用是引用不在同一個文件中的變量或者函數(shù)。
main.c
#include<stdio.h> int main() { extern int num; printf("%d",num); return 0; }
b.c
#include<stdio.h> int num = 5; void func() { printf("fun in a.c"); }
例如,這里b.c中定義了一個變量num,如果main.c中想要引用這個變量,那么可以使用extern這個關(guān)鍵字,注意這里能成功引用的原因是,num這個關(guān)鍵字在b.c中是一個全局變量,也就是說只有當(dāng)一個變量是一個全局變量時,extern變量才會起作用,向下面這樣是不行的。
mian.c
#include<stdio.h> int main() { extern int num; printf("%d",num); return 0; }
b.c
#include<stdio.h> void func() { int num = 5; printf("fun in a.c"); }
另外,extern關(guān)鍵字只需要指明類型和變量名就行了,不能再重新賦值,初始化需要在原文件所在處進(jìn)行,如果不進(jìn)行初始化的話,全局變量會被編譯器自動初始化為0。像這種寫法是不行的。
extern int num=4;
但是在聲明之后就可以使用變量名進(jìn)行修改了,像這樣:
#include<stdio.h> int main() { extern int num; num=1; printf("%d",num); return 0; }
如果不想這個變量被修改可以使用const關(guān)鍵字進(jìn)行修飾,寫法如下:
mian.c
#include<stdio.h> int main() { extern const int num; printf("%d",num); return 0; }
b.c
#include<stdio.h> const int num=5; void func() { printf("fun in a.c"); }
使用include將另一個文件全部包含進(jìn)去可以引用另一個文件中的變量,但是這樣做的結(jié)果就是,被包含的文件中的所有的變量和方法都可以被這個文件使用,這樣就變得不安全,如果只是希望一個文件使用另一個文件中的某個變量還是使用extern關(guān)鍵字更好。
三、引用另一個文件中的函數(shù)
extern除了引用另一個文件中的變量外,還可以引用另一個文件中的函數(shù),引用方法和引用變量相似。
mian.c
#include<stdio.h> int main() { extern void func(); func(); return 0; }
b.c
#include<stdio.h> const int num=5; void func() { printf("fun in a.c"); }
這里main函數(shù)中引用了b.c中的函數(shù)func。因?yàn)樗械暮瘮?shù)都是全局的,所以對函數(shù)的extern用法和對全局變量的修飾基本相同,需要注意的就是,需要指明返回值的類型和參數(shù)。
以上所述是小編給大家介紹的C語言正確使用extern關(guān)鍵字詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:如何在C語言中判斷socket是否已經(jīng)斷開
欄 目:C語言
下一篇:C++利用兩個棧實(shí)現(xiàn)隊(duì)列的方法
本文標(biāo)題:詳解C語言正確使用extern關(guān)鍵字
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/313.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法