創作內容

0 GP

不懂C語言的extern是做什麼的....以下摘錄網友網民的講解連結

作者:臉一直出油│2009-11-12 14:29:56│巴幣:0│人氣:32556
它照網路上字面解釋為一種宣告變數宣告的修飾字,可使變數有不同特性
知道他有作用,但仍不大懂,如果有實際範例能看就好了
_____________________________________________________
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();
 
<這邊複製文章時,連網址也自動複製進去>
變量聲明和定義及extern轉載
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppsl/20081117/151361.html)
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使編譯器知道這些全局變量的名字和類型,同時不再分配內存,當鏈接程序鏈接各個文件的時候,
自動處理所有對外部變量的引用。
 
 
作者:唐山人,姓方,索性就叫tshfang。喜歡計算機,喜歡讀書尤其是史書。技術共享,大家方便,讓我們一起創造一個自由空間。
工作領域:ERP系統、計算機編程 
文章來源:泥胚文章寫作網 http://www.nipei.com原文地址:http://www.nipei.com/article/3246
轉載本文章必須保留作者、出處鏈接以及本聲明。
轉載不註明出處、程序採集是侵權行為,我們保留追究其一切責任的權利。 
作者:tshfang 
来源: 泥胚文章写作 http://www.nipei.com 原文地址: http://www.nipei.com/article/3246
 
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=959807
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

留言共 1 篇留言

Alchemist
跟您請教一下,為何此程式無法編譯?@@
1.
#include <stdio.h>
int i1=0;
int i2=0;
void myfun(int n);
void main(void){
myfun(10);
printf("i1=%d\n", i1);
printf("i2=%d\n", i2);
}

-------------------------------
2.
extern i1;
extern i2;
void myfun(int n){
extern int i1;
for(i1=0;i1<n;i1++){
i1+=1;
i2+=2;
}
}

把以上程式碼都以.C檔存在同一個目錄裡,為何無法編譯??

04-18 16:26

我要留言提醒:您尚未登入,請先登入再留言

喜歡★sudokulogic 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:分析師:電子書閱讀器賣台... 後一篇:殘酷的歷史,大學生示威遊...

追蹤私訊切換新版閱覽

作品資料夾

russell11大家
我翻譯的〈羅生門〉全文免費公開中! 方格子 https://vocus.cc/article/66a54f4efd89780001e65ee1看更多我要大聲說昨天16:17


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】