2011-02-23 65 views
1

我知道static關鍵字使C函數/變量是文件作用域。 我讀過,如果我想打一個變量全局範圍(由多個文件訪問),我應該怎麼做:extern關鍵字與函數名稱

.c文件:

int my_global_var; 

// main().... 
.h文件

extern int my_global_var; 

因此,任何一個將包括我.h文件將能夠引用my_global_var這已經是extern版。

而且我也讀過這個功能也是必需的,但是我使用的是gcc 4.x而我沒有extern的功能.h文件和其他程序可以成功地link它。

所以,問題是......

是非靜態功能鍵的行爲是默認的或者我應該extern非靜態函數堅持標準

+0

【如何正確使用在c的extern keword](HTTP的可能重複一個:// stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keword-in-c) – 2011-02-23 16:56:40

回答

2

從標準,6.2.2

如果對於功能的標識符的聲明不具有存儲類 說明符,其聯動確定 完全一樣,如果它用 聲明存儲類說明符extern。如果 對象 的標識符聲明具有文件範圍,並且沒有 存儲類說明符,則其鏈接 是外部的。

含義,默認情況下是外部的。

1

默認情況下,函數和對象聲明都是extern。但是,您需要在頭文件中爲對象聲明添加一個明確的extern以避免重新定義:如果沒有存儲類說明符,則任何文件範圍對象聲明實際上都會被稱爲暫定義併爲當前翻譯單元中的對象。

爲了一致性,我不必要地使用extern甚至函數聲明。在大多數情況下,我頭內聲明的對象爲

extern int foo; 
static const int bar = 42; 

一個和功能的

extern int spam(void); 
static inline int eggs(void) { return 42; } 
相關問題