它照網路上字面解釋為一種宣告變數宣告的修飾字,可使變數有不同特性
知道他有作用,但仍不大懂,如果有實際範例能看就好了
_____________________________________________________
caiyi9000(小貓)回復於2001-07-02 16:38:25得分 10
extern主要防止重定義
比如,你在工程的func1.c裡定義了
void func()
{
}
而你想在func2.c裡調用此函數,你沒不要去包含聲明此函數的func1.h,因為這樣可能導致一些重定義,所以你在func.c裡
extern void func();
就行了。
另一種情況
在func1.c裡調用了另一個函數subfunc(),而subfunc()又在func()之後定義,此時你就必須在func1.h裡用extern聲明subfunc,而不能直接聲明subfunc(),因為這樣就重定義了。
void func()
{
subfunc(); //調用另一個函數
}
void subfunc
{
...
}
//func.h
extern void subfunc();
<這邊複製文章時,連網址也自動複製進去>
2. 聲明與定義的區別
函數或變量在聲明時,並沒有給它實際的物理內存空間,它有時候可以保證你的程序編譯通過,但是當函數或變量定義的時候,它就在內存中有了實際的物理空間,如果你在編譯模塊中引用的外部變量沒有在整個工程中任何一個地方定義的話,那麼即使它在編譯時可以通過,在連接時也會報錯,因為程序在內存中找不到這個變量!你也可以這樣理解,對同一個變量或函數的聲明可以有多次,而定義只能有一次!
extern的作用
extern有兩個作用,第一個,當它與"C"一起連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函數名時按著C的規則去翻譯相應的函數名而不是C++的, C++的規則在翻譯這個函數名時會把fun這個名字變得面目全非,可能是fun@aBc_int_int#%$也可能是別的,這要看編譯器的"脾氣"了(不同的編譯器採用的方法不一樣),為什麼這麼做呢,因為C++支持函數的重載啊,在這裡不去過多的論述這個問題,如果你有興趣可以去網上搜索,相信你可以得到滿意的解釋!
當extern不與"C"在一起修飾變量或函數時,如在頭文件中: extern int g_Int;它的作用就是聲明函數或全局變量的作用範圍的關鍵字,其聲明的函數和變量可以在本模塊或其他模塊中使用,記住它是一個聲明不是定義!也就是說B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數時,它只要包含A模塊的頭文件即可,在編譯階段,模塊B雖然找不到該函數或變量,但它不會報錯,它會在連接時從模塊A生成的目標代碼中找到此函數。
用static修飾的全局變量
首先,我要告訴你static與extern是一對“水火不容”的傢伙,也就是說extern和static不能同時修飾一個變量;其次,static修飾的全局變量聲明與定義同時進行,也就是說當你在頭文件中使用static聲明了全局變量後,它也同時被定義了;最後,static修飾全局變量的作用域只能是本身的編譯單元,也就是說它的“全局”只對本編譯單元有效,其他編譯單元則看不到它
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
c語言有三種鏈接,外部鏈接,內部鏈接和無鏈接。
外部鏈接:對構成程序的所有文件可用,如函數和全局變量具有外部鏈接。
內部鏈接:僅在聲明他們的文件中是已知的。如聲明為static的文件域具有內部鏈接。
無連接:僅在自己的塊中已知,其它地方沒有辦法訪問,如局部變量。
extern主要作用是:聲明在程序的其它地方使用外部鏈接聲明的對象。
聲明:表述對象的名稱和類型。
定義:為對象分配存儲空間。
例如:
int main(void)
{
extern int a, b;
printf("%d %d", a, b);
getch();
return 0;
}
/*全局變量定義到了main之後*/
int a = 10, b = 20;
程序輸出10 20。
通過extern聲明變量a和b,可以在a和b定義之前使用,編譯器不會提示錯誤。
extern最重要的用途是多文件程序,c允許程序分散在多個文件中,分別編譯,鏈接到一起。
我們在devc++中新建立一個c工程,然後在添新建一個單元保存名稱為cunclx3.c
main.c的程序代碼:
#include <stdio.h>
#include <stdlib.h>
int x,y;
int main(int argc, char *argv[])
{
x=100;
y=10;
printf("in main x is %d and y is %d\n",x,y);
fun();
getch();
system("PAUSE");
return 0;
}
cunclx3.c的程序代碼是:
extern int x,y;
void fun(void)
{
x/=y;
y/=2;
printf("in fun x is %d and y is %d\n",x,y);
}
調試運行,沒有問題程序正查輸出,可以嘗試將extern int x,y;代碼加上註釋,編譯器將提示錯誤。
extern使編譯器知道這些全局變量的名字和類型,同時不再分配內存,當鏈接程序鏈接各個文件的時候,
自動處理所有對外部變量的引用。