linux c 一站式學習 extern關鍵詞作用、變量的聲明與定義以及extern與include的區別(都與extern有關)

       extern的大致有兩個作用,就是後面加不加C。
一,後面加C如: extern "C" void fun(int a, int b);就是告訴編譯器在編譯fun這個函數名時按着C的規則去翻譯相應的函數名而不是C++的,C++的規則在翻譯這個函數名時會把fun這個名字變得面目全非。
      二,不加C修飾變量和函數 如extern int g_Int;就是聲明的這個變量或函數在在其他文件中可見,(隱含的一層意思是定義在其他地方)

變量的聲明與定義
1.定義也是聲明,extern聲明不是定義,即不分配存儲空間。extern告訴編譯器變量在其他地方定義了。
例如:extern int i; //聲明,不是定義
int i; //定義
2.如果聲明有初始化式,就被當作定義,即使前面加了extern。只有當extern聲明位於函數外部時,纔可以被初始化。
例如:extern double pi=3.1416; //定義
3.函數的聲明和定義區別比較簡單,帶有{ }的就是定義,否則就是聲明。
例如:extern double max(double d1,double d2); //聲明
4.除非有extern關鍵字,否則都是變量的定義。
例如:extern int i; //聲明
int i; //定義

另外

void main()  
{  
    extern int a;//定義和聲明不能放在同一個函數裏  
    int a=10;   //再定義a=10錯誤  
    cout<<hex<<&a<<endl;  
}  
void main()  
{  
    extern int a=10;//在函數體內聲明不能被初始化  
    cout<<a<<endl;//這是一個錯誤的表達式  
}  
extern int a;//說明聲明可以聲明多次,而定義卻只能定義一次  
extern int a;  
extern int a;  
void main()  
{  
    int a=10;  
    cout<<a<<endl;  
}     


    extern與include關係
    兩個疑惑,有extern聲明外部變量或函數,還需要include做什麼。再者,我們知道預編譯器只是把include頭文件部分進行相應展開,那麼頭文件中聲明int a,需不需要前面加extern。
    問題一個一個來。
    第一個問題,有點像零售和批發的意思。
    第二個問題
   這個extern有個身份mmp的地方,日了狗,在定義變量的時候,這個extern居然可以被省略(定義時,默認均省略);在聲明變量的時候,這個extern必須添加在變量前,所以有時會讓你搞不清楚到底是聲明還是定義。或者說,變量前有extern不一定就是聲明,而變量前無extern就只能是定義。注:定義要爲變量分配內存空間;而聲明不需要爲變量分配內存空間。
    例如,每個源文件中包含一個頭文件,這個頭文件中有a的定義int a;每個源文件在單獨編譯時不會出錯,但是連接時會出出現重複定義的錯誤。
    對於函數來說也一樣,也是定義和聲明,定義的時候用extern,說明這個函數是可以被外部引用的,聲明的時候用extern說明這是一個聲明。 但由於函數的定義和聲明是有區別的,定義函數要有函數體,聲明函數沒有函數體(還有以分號結尾),所以函數定義和聲明時都可以將extern省略掉,反正其他文件也是知道這個函數是在其他地方定義的,所以不加extern也行。兩者如此不同,所以省略了extern也不會有問題。
總結:

變量而言,如果你想在本源文件(例如文件名A)中使用另一個源文件(例如文件名B)的變量,方法有2種:

(1)在A文件中必須用extern聲明在B文件中定義的變量(當然是全局變量);

(2)在A文件中添加B文件對應的頭文件,當然這個頭文件包含B文件中的變量聲明,也即在這個頭文件中必

須用extern聲明該變量,否則,該變量又被定義一次。

函數而言,如果你想在本源文件(例如文件名A)中使用另一個源文件(例如文件名B)的函數,方法有2種:

(1)在A文件中用extern聲明在B文件中定義的函數(其實,也可省略extern,只需在A文件中出現B文件定義

函數原型即可);

(2)在A文件中添加B文件對應的頭文件,當然這個頭文件包含B文件中的函數原型,在頭文件中函數可以

不用加extern。

轉自:http://lpy999.blog.163.com/blog/static/117372061201182051413310/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章