2013-01-31 71 views
3

當我在我的頭文件中聲明函數原型時,即使我從不使用'extern'關鍵字,我也可以到達程序中的任何地方。它們只對靜態庫很重要,或者我什麼時候需要它?extern關鍵字的用法

回答

5

默認功能是externextern關鍵字僅對變量有用。

2

的extern是C.

默認存儲類說明明確指定它放在變量

extern int i; 

,如果它可以模塊之間共享。然後

int i; 

在其他模塊不會違反ODR。

對於功能是的,很沒用。

+0

'的extern INT i'只是_declares_變量,一個'詮釋i'某處被要求作爲_definition_ – vonbrand

1

對於函數聲明,它們不是必需的。他們只需要聲明外部全局變量:

// header 
extern int foo; 

// implementation (.c) 
int foo; 

Wihout的extern,編譯器會在每次遇到它(因爲包含的頭)時間實例全局變量,你會得到一個連接錯誤。

這個關鍵字的另一種使用情況是使C++ C代碼 - 兼容通過指定它爲C鍵的(這又可以防止連接錯誤,即那些引起C++名稱重整):

#ifdef __cplusplus 
extern "C" { 
#endif 

void foo(void); 

#ifdef __cplusplus 
} 
#endif 
+0

I N在你的例子中編寫代碼。我只在頭文件中有'int foo'(沒有外部文件)。我看到你聲明瞭兩次,一次在extern頭部,第二次在.C文件中。這對我在做什麼有什麼好處? – Muis

+1

@Joshua,頭部包含_declaration_,'.c'文件包含_definition_。這允許多個「.c」(翻譯單元)訪問變量的相同實例(即,只有一個「foo」實例)。 – hmjd

+0

@hmjd但是使用我的方法(只在頭文件中,沒有extern)多個.c文件也可以訪問同一個實例?所以我真的沒有看到區別? – Muis

0

默認,所有的功能都的extern ..

extern關鍵字只能用於變量..

+0

忘了'auto','static','register' ;-) – vonbrand

+0

@vonbrand:我不會讓你..你能更具體嗎? :) –

+0

這些是很少使用正確的其他關鍵字。 – vonbrand