天天看點

C/C++ extern 關鍵詞詳解

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

extern + 變量

 在一個源檔案裡定義了一個數組:char a[5];

 在另外一個檔案裡用下列語句進行了聲明:extern char *a;

請問,這樣可以嗎?

答案與分析:

  1)、不可以,程式運作時會告訴你非法通路。原因在于,指向類型T的指針并不等價于類型T的數組。extern char *a聲明的是一個指針變量而不是字元數組,是以與實際的定義不同,進而造成運作時非法通路。應該将聲明改為extern char a[ ]。

  2)、extern 用在變量聲明中常常有這樣一個作用,你在*.c檔案中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中并用extern來聲明。

extern 函數聲明

  常常見extern放在函數的前面成為函數聲明的一部分,那麼,C語言的關鍵字extern在函數的聲明中起什麼作用?

答案與分析:

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

extern int f(); 和int f();

  當然,這樣的用處還是有的,就是在程式中取代include “*.h”來聲明函數。

extern 和 static

(1) extern 表明該變量在别的地方已經定義過了,在這裡要使用那個變量。

(2) static 表示靜态的變量,配置設定記憶體的時候, 存儲在靜态區,不存儲在棧上面。

static 作用範圍是内部連接配接的關系, 和extern有點相反.它和對象本身是分開存儲的,extern也是分開存儲的,但是extern可以被其他的對象用extern 引用,而static 不可以,隻允許對象本身用它. 

具體差别:

  • 首先,extern和static不能同時修飾一個變量;
  • 其次,static修飾的全局變量聲明與定義同時進行,也就是說當你在頭檔案中使用static聲明了全局變量後,它也同時被定義了;
  • 最後,static修飾全局變量的作用域隻能是本身的編譯單元,也就是說它的“全局”隻對本編譯單元有效,其他編譯單元則看不到它
  • 一般定義static全局變量時,都把它放在源檔案中而不是頭檔案,這樣就不會給其他子產品造成不必要的資訊污染。

extern 和const

C++中const修飾的全局常量據有跟static相同的特性,即它們隻能作用于本編譯子產品中,但是const可以與extern連用來聲明該常量可以作用于其他編譯子產品中, 如extern const char g_str[];

然後在原檔案中别忘了定義: const char g_str[] = "123456";

是以當const單獨使用時它就與static相同,而當與extern一起合作的時候,它的特性就跟extern的一樣了!是以對const我沒有什麼可以過多的描述 我隻是想提醒你,const char* g_str = "123456" 與 const char g_str[] ="123465"是不同的, 前面那個const 修飾的是char *而不是g_str,它的g_str并不是常量,它被看做是一個定義了的全局變量(可以被其他編譯單元使用), 是以如果你想讓char*g_str遵守const的全局常量的規則,最好這麼定義const char* const g_str="123456".(頂層和底層const的差別)

繼續閱讀