聲明:用來告訴編譯器變量的名稱和類型,而不分配內存,不賦初值。
定義:為了給變量分配內存,可以為變量賦初值。
注:定義要為變量分配內存空間;而聲明不需要為變量分配內存空間。
為什么要用extern 函數呢?直接#include相應的頭文件不可以嘛?
例子,如led.cpp 想調用delay.cpp中的delayms函數,有兩種方法:
方法1:include 頭文件,即直接?#delay.h?
方法2: ?extern 方法 ,extern void delayms這句在調用文件中使用,表示引用全局函數delayms()。
優點:不inlcude delayms.h就不會引入大量頭文件,進而不會引入大量的無關函數。這樣做的一個明顯的好處是,會加速程序的編譯(確切的說是預處理)的過程,節省時間。?在makefile中需要led.o和delay.o寫在一起,否則link的時候找不到delayms而報錯。
2.2 extern 變量如果文件b.c需要引用a.c中變量int v,就可以在b.c中聲明extern int v,然后就可以引用變量v。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。注意,extern int v可以放在a.c中的任何地方,具體作用范圍和局部變量相同。
extern的原理很簡單,就是告訴編譯器:“你現在編譯的文件中,有一個標識符雖然沒有在本文件中定義,但是它是在別的文件中定義的全局變量,你要放行!”
比如在C++中調用C庫函數,就需要在C++程序中用extern “C”聲明要引用的函數。這是給鏈接器用的,告訴鏈接器在鏈接的時候用C函數規范來鏈接。主要原因是C++和C程序編譯完成后在目標代碼中命名規則不同。?
注意:聲明可以多次,定義只能一次。
extern int i; //聲明,不是定義
int i; //聲明,也是定義
非常難以理解的是,在定義變量的時候,這個extern居然可以被省略(定義時,默認均省略);在聲明變量的時候,這個extern必須添加在變量前,所以有時會讓你搞不清楚到底是聲明還是定義。
或者說,變量前有extern不一定就是聲明(首先聲明必須要有extern,但是定義如果不省略也可以有extern),而變量前無extern就只能是定義(聲明必須要有extern,沒有extern只能是定義省略extern的情況)!!!
一般來講,定義默認省略extern,因此可以得到:有extern為聲明,沒有extern為定義。
小技巧:無論是否有extern修飾,賦初值==定義。如下兩種方式是等價的,必為定義!!!
//如果在聲明的時候給變量賦值,那么就去掉extern直接定義變量賦值是等價的
extern int a = 10;//盡量不要寫這種定義方式
int a = 10;//上述兩條語句等價
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧