標籤:功能 func 怎麼辦 參數 不能 初始化 pre 執行個體 href
利用關鍵字extern,可以在一個檔案中引用另一個檔案中定義的變數或者函數,下面就結合具體的執行個體,分類說明一下。
一、引用同一個檔案中的變數
1 #include<stdio.h> 2 3 int func(); 4 5 int main() 6 { 7 func(); //1 8 printf("%d",num); //2 9 return 0;10 }11 12 int num = 3;13 14 int func()15 {16 printf("%d\n",num);17 }
如果按照這個順序,變數 num在main函數的後邊進行聲明和初始化的話,那麼在main函數中是不能直接引用num這個變數的,因為當編譯器編譯到這一句話的時候,找不到num這個變數的聲明,但是在func函數中是可以正常使用,因為func對num的調用是發生在num的聲明和初始化之後。
如果我不想改變num的聲明的位置,但是想在main函數中直接使用num這個變數,怎麼辦呢?可以使用extern這個關鍵字。像下面這一段代碼,利用extern關鍵字先聲明一下num變數,告訴編譯器num這個變數是存在的,但是不是在這之前聲明的,你到別的地方找找吧,果然,這樣就可以順利通過編譯啦。但是你要是想欺騙編譯器也是不行的,比如你聲明了extern int num;但是在後面卻沒有真正的給出num變數的聲明,那麼編譯器去別的地方找了,但是沒找到還是不行的。
下面的程式就是利用extern關鍵字,使用在後邊定義的變數。
1 #include<stdio.h> 2 3 int func(); 4 5 int main() 6 { 7 func(); //1 8 extern int num; 9 printf("%d",num); //210 return 0;11 }12 13 int num = 3;14 15 int func()16 {17 printf("%d\n",num);18 }二、引用另一個檔案中的變數
如果extern這個關鍵字就這點功能,那麼這個關鍵字就顯得多餘了,因為上邊的程式可以通過將num變數在main函數的上邊聲明,使得在main函數中也可以使用。
extern這個關鍵字的真正的作用是引用不在同一個檔案中的變數或者函數。
main.c
1 #include<stdio.h>2 3 int main()4 {5 extern int num;6 printf("%d",num);7 return 0;8 }
b.c
1 #include<stdio.h>2 3 int num = 5;4 5 void func()6 {7 printf("fun in a.c");8 }
例如,這裡b.c中定義了一個變數num,如果main.c中想要引用這個變數,那麼可以使用extern這個關鍵字,注意這裡能成功引用的原因是,num這個關鍵字在b.c中是一個全域變數,也就是說只有當一個變數是一個全域變數時,extern變數才會起作用,向下面這樣是不行的。
mian.c
1 #include<stdio.h>2 3 int main()4 {5 extern int num;6 printf("%d",num);7 return 0;8 }
b.c
1 #include<stdio.h>2 3 void func()4 {5 int num = 5;6 printf("fun in a.c");7 }
另外,extern關鍵字只需要指明類型和變數名就行了,不能再重新賦值,初始化需要在原檔案所在處進行,如果不進行初始化的話,全域變數會被編譯器自動初始化為0。像這種寫法是不行的。
1 extern int num=4;
但是在聲明之後就可以使用變數名進行修改了,像這樣:
1 #include<stdio.h>2 3 int main()4 {5 extern int num;6 num=1;7 printf("%d",num);8 return 0;9 }
如果不想這個變數被修改可以使用const關鍵字進行修飾,寫法如下:
mian.c
1 #include<stdio.h>2 3 int main()4 {5 extern const int num;6 printf("%d",num);7 return 0;8 }
b.c
1 #include<stdio.h>2 3 const int num=5;4 void func()5 {6 printf("fun in a.c");7 }
使用include將另一個檔案全部包含進去也可以引用另一個檔案中的變數,但是這樣做的結果就是,被包含的檔案中的所有的變數和方法都可以被這個檔案使用,這樣就變得不安全,如果只是希望一個檔案使用另一個檔案中的某個變數還是使用extern關鍵字更好。
三、引用另一個檔案中的函數
extern除了引用另一個檔案中的變數外,還可以引用另一個檔案中的函數,引用方法和引用變數相似。
mian.c
1 #include<stdio.h>2 3 int main()4 {5 extern void func();6 func();7 return 0;8 }
b.c
1 #include<stdio.h>2 3 const int num=5;4 void func()5 {6 printf("fun in a.c");7 }
這裡main函數中引用了b.c中的函數func。因為所有的函數都是全域的,所以對函數的extern用法和對全域變數的修飾基本相同,需要注意的就是,需要指明傳回值的類型和參數。
轉自《http://blog.csdn.net/xingjiarong/article/details/47656339》
【轉】C語言正確使用extern關鍵字