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;              //這是變量的定義,變量定義是分配空間的 ;
      定義只能有一處,但聲明可有多處,這些聲明所指,都是定義時分配的內存空間   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章