【轉】C語言正確使用extern關鍵字


 

 

 

  利用關鍵字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); //2
10     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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM