請問一下,extern的作用是如何呢?
請詳細的說明
謝謝!!
2005-01-08 13:18:32 · 3 個解答 · 發問者 阿華 5 in 電腦與網際網路 ➔ 程式設計
extern 主要是用來表示後面所跟的東西是定義在別的檔案裡。
舉例來說。你有兩個檔案 a.cpp 和 b.cpp
在 a.cpp 裡你可以定義
char str[] = "this is a book";
若你在 b.cpp 裡想使用 str 這個字串,只要你宣告
extern char *str;
即可。
所以,做了這個宣告之後你就可以在 b.ccp 中執行
printf("%s", a);
而執行結果就會在畫面上印出 "this is a book"
另外,extern 後面也可以跟著函式。只不過意義不大。
像一般大多數的函式實作都是在一個.cpp 或 .c 檔裡進行。
而我們在 .h 裡宣告函式也都只寫
int f();
而不需要寫
extern int f();
其實這兩種寫法的效果是一樣的。
2005-01-19 10:21:40 補充:
雖然我的答案被選為最佳解。不過看完Annihilator 的說明之後,我覺得他的解釋才是最清楚,最完整的。
不過,實際應用上來說,extern 的確多是用來處理變數定義在別的檔案這種情況。而且,據我所知現在程式寫法裡也比較少有人用 extern 這種方式來避免 .h 檔被 #include 超過一次。
Anyway,Annihilator 的答案應該才是最佳解。
2005-01-12 15:49:20 · answer #1 · answered by Essential 2 · 0⤊ 0⤋
extern 的作用是告訴編譯程式, 後面所做的宣告只供型別檢查使用, 不需要將之實體化。
詳細的說法是, 相同的符號 (無論是變數或函數) 被宣告時, 只要冠上 extern, 編譯器在遇到這些宣告時, 只會檢查所宣告的型別是否和曾經出現過的發生衝突, 並不會配置記憶體空間給該變數, 也不會設定函數或變數的 scope 範圍 (所有 extern 符號 scope 都是全域, 即使出現在函數內的宣告也一樣)。
因此, 以下的宣告出現在同一個檔案中完全合法:
extern int foo;
extern int foo;
typedef int int_t;
extern int_t foo;
extern void bar();
extern void bar();
extern void bar(int a); // polymorph
所以許多函式庫在提供其 header 檔時, 多半會在函數和變數前面加上 extern, 這樣應用程式在使用這些函式庫時, 就不需要擔心哪一個 .h 檔被 #include 了超過一次, 而產生符號重複定義的錯誤。
同一個符號 extern 的宣告和沒有 extern 的宣告可以出現在同一個檔案中, 因此 extern 並不一定表示該符號的定義在別的檔案。所以函式庫的 .c 檔可以 #include 自己含有 extern 宣告的 .h 檔, 不會發生問題。
2005-01-12 20:09:33 · answer #2 · answered by Annihilator 3 · 0⤊ 0⤋
在程式中的變數有其生存空間,簡單的說,你在a函式中宣告了一個int test的變數,需在b函式中也宣告了一個int test的變數,如下所示
void a( void )
{
int test;
}
void b( void )
{
int test;
}
此時這二個test的變數分別生存於a函式及b函式中,不會相互影響,這就是區域生存空間,但如果在函式外宣告一全域變數,它的生存空間就稱為全域生存空間,如下所示:
int test;
void a( void )
{
extern int test;
}
void b( void )
{
extern int test;
}
以上是比較嚴謹的寫法,我以『顯性』的方式告訴compiler,於a函式及b函式中的test變數要使用全域生存空間的test,不過你可以不需要於函式內使用extern就可以使用test,compiler會直接於套用全域變數的test.....
以上的例子是當你的code全寫在同一個檔案時,不過發展大一點的程式時,你可能會在a.c中引用到b.c的int test全域變數,那你就需要在a.c的全域中宣告extern int test來告訴compiler及linker你需要引用其它檔案的int test變數...
2005-01-12 15:51:36 · answer #3 · answered by 君子自強不息 2 · 0⤊ 0⤋