天天看點

extern && #include *.h

         extern可以置于變量或者函數前,以表示變量或者函數的定義在别的檔案中,提示編譯器遇到此變量或者函數時在其他子產品中尋找其定義。

      如今的編譯器一般都是采用按檔案編譯的方式,是以在編譯時,各個檔案中定義的全局變量是互相透明的,也就是說,在編譯時,全局變量的可見域限制在檔案内部。但是到了連結階段,各個檔案的内容(實際上是編譯産生的obj檔案)是被合并到一起的,定義于某檔案内的全局變量,在連結完成後,它的可見範圍被擴大到了整個程式。是以,如果某些檔案中定義的全局變量名相同的話,在這個時候就會出現錯誤,是以,各個檔案中定義的全局變量名不能相同。

       編譯器在編譯過程中不會意識到某個變量符号雖然不是本檔案定義的,但是它可能是在其它的檔案中定義的。為了幫助編譯器來解決這個問題。就要使用extern了。extern的原理很簡單,就是告訴編譯器:“你現在編譯的檔案中,有一個辨別符雖然沒有在本檔案中定義,但是它是在别的檔案中定義的全局變量,你隻要放行就ok了!”

       函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在别的源檔案裡定義,沒有其它作用。如下述兩個函數聲明沒有明顯的差別:

   extern int fx(); 和int fx();  

    當然,這樣的用處還是有的:在一些複雜的項目中,在函數聲明前添加extern修飾,就可以在程式中取代include “*.h”來聲明函數。但是當函數提供方單方面修改函數原型時,如果在使用方不知情的情況下繼續沿用原來的extern聲明,這樣編譯時編譯器不會報錯。但是在運作過程中,因為少了或者多了輸入參數,往往會造成系統錯誤。目前業界針對這種情況的處理沒有一個很完美的方案,通常的做法是提供方在自己的頭檔案中提供對外部接口的聲明,然後調用方include該頭檔案,進而省去extern這一步以避免這種錯誤。由此可見對extern的應用,不同的場合應該選擇不同的做法。

         變量的聲明中帶有關鍵字extern,并沒有生成新資料,它僅表明這個資料是共享的。這個變量必須是在别處定義過的,而且它隻能定義一次  

extern   int   a;

        是對變量的聲明,而不是定義,表示該變量a是其他檔案中定義的,或是本檔案中在該聲明之後定義的全局變量,需要在這裡引用。由于 a已在别的地方定義了,是以不需要再配置設定空間了。

         變量在使用前已經定義了,一般有兩種情況:

一:該變量是在其他的檔案中定義的全局變量,簡稱外部變量。

二:變量在本檔案中定義的全局變量,但是在使用之後定義的。  

      extern   int   a;//這是變量的聲明,是告訴編譯器到該檔案外部去找這個檔案的定義;聲明是不配置設定記憶體的 

      int   a;              //這是變量的定義,變量定義是配置設定空間的 ;

      定義隻能有一處,但聲明可有多處,這些聲明所指,都是定義時配置設定的記憶體空間   

繼續閱讀