extern 在c c 中的作用

2021-09-01 09:33:57 字數 2586 閱讀 8651

extern   "c"     表示函式使用c的連線方式,也就是說能被c語言寫的程式呼叫(c和c++的連線方式是不一樣的)。  

聯想   extern   "c++"大概也知道了吧   

在c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern「c」宣告?   

因為   c   語言和   c++   語言的編譯規則不一樣,所以要告訴系統哪些函式是用   c   方式編譯,哪些函式需要用   c++   方式編譯。   

如果你不加   extern   "c"   ,在編譯時,系統會提示找不到此函式。   

extern   "c"表示編譯生成的內部符號名使用c約定   

例如:   

int   fun(int   i,int   j)   

c:_fun   

c++:_fun_int_int   

具體生成什麼可能與編譯器有關   

由於c++支援過載,而過載是在編譯期確定的,所以c++必須在內部符號名上區分各過載函式,所以就將引數型別加在函式名後。   

extern關鍵字告訴編譯器,「這個變數可能定義在這個模組或其它模組中」,乙個extern宣告並沒有生成資料,它僅表明這個資料是共享的。這個變數必須是在別處定義過的,而且它只能定義一次   

例子如下:   

extern   "c"   declaration;   

其中"c"是可選的,包括「c」表明這個條目是根據c語言的約定 來宣告的。這個特徵使得c語言的模組,不必象c++**需要進行對名字改寫和編譯而可以直接訪問這些條目。   

以下是c++primer上的一段話   

如果成員希望呼叫以另一種語言寫成的程式,編譯器必須控制函式呼叫時的不同需求。例如,c++和其他語言對於漢式命名方式或引數傳遞次序可能與所不同。   

這個問題要涉及乙個基本的知識就是你要知道編譯器的處理過程是什麼的,知道的結果就是了解source   file和translation   unit的聯絡和區別。   

說簡單一點translation   unit就是編譯器處理過的source   file。處理包括詞彙分析,預處理等等,對於你的問題,重要是理解#include的處理意思,是包含#include檔案內容使之成為本身的一部分。   

說到你這個問題,   

簡單說就是「外部連線」的實體(包括變數,函式等)可以在定義實體的translation   unit以外的部分(程式空間)被引用,但是「內部連線」的實體只能在定義實體的translation   unit中使用。   

去看看彙編中對於obj檔案中的名字連線屬性的講解吧。   

簡單地說就是:乙個transunit會編譯出乙個obj檔案,不同的obj檔案是分開編譯的,在連線時,具有internal   linkage的名字不可能被其他的obj檔案所使用,只有具有external   linkage的名字才可以被別的obj檔案所使用。   

舉例來說就是,乙個函式,如果不具有external   linkage的話,那它只可以在實現它的那個transunit中被呼叫,在其他的transunit中被呼叫會引發linker的乙個連線錯誤。   

extern   "c"用在c++裡表示,被其修飾的函式,類,結構在編譯時按照c的編譯規則進行,沒有mangling   

在c++中,由於某種原因,比如過載:不同函式體的函式可能有著相同的名字,當然這是相對於程式設計師來說,實際上,為了區分這些有著相同名字的過載函式,c++編譯器偷偷的在背後給這些函式取了特殊的名字以區分它們,這就被稱為c++的mangling。   

同樣的,類中的變數有可能與類外的變數同名,當然我們程式設計時可以用"."來區分,而編譯器在編譯時,則是通過mangling為類中的變數取了乙個獨一無二的名字,這個名字顯然與程式設計師所取的名字不同。   

加了extern   "c"後就不會mangling,函式(或類之成員變數)是什麼名字,在編譯器編譯過程中仍然是這個名字,生成的目標檔案.obj裡這個函式還是這個名字。   

extern   int   a   表示   a是在其它檔案中定義的乙個變數,需要在這裡引用。   

a已在別的檔案中,所以不需要再分配空間了   

extern   int   a   定義的a變數表示該變數在使用前已經定義了,一般有兩種情況,一是該變數是在其他的檔案中定義的全域性變數,簡稱外部變數。二種情況表示變數在本檔案中定義的全域性變數,但是在使用之後(因為作用域)定義的。   

extern   int   a   是對變數的宣告,而不是定義,該變數是其他檔案中定義的,或是本檔案中在該宣告之後定義的全域性變數。   

extern   int   a;//這是變數宣告,是告訴編譯器到該檔案外部去找這個檔案的定義   

//宣告是不分配記憶體的   

int   a;//這是變數定義,變數定義是分配空間的   

定義只能有一處,但宣告可有多處,這些宣告所指,都是定義時分配的記憶體空間   

static和extern都被稱為"global"變數(或者函式)。   

但是他們的生存週期和可見性是不同。static是檔案級,   

只有程式檔案之間顯式的包含才可以引用(主要就是使用#include)   

但是extern是程式級的,你不必顯式的引用檔案的,但需要使用extern   

儲存空間修飾符,這個任務編譯器,  

c c 中extern的作用

看一下下面這個程式 include using namespace std intmain 這個程式編譯是有問題的,因為你根本沒有寫add這個函式,編譯器會給你報錯。但是再看這個 include using namespace std extern intadd int a,int b int ma...

C C 中extern的用法

比如在乙個test.h檔案中有如下 include using namespace std int a 1 void printlog 如果想要在另外乙個原始檔中使用這些全域性變數的話,需要首先用extern宣告一下在本檔案中使用的變數可以再其他模組中尋找到 在main.c中這樣寫 include ...

C C 中extern的用法

1 extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,被引用的變數v的鏈結屬性必須是外鏈結 external 的,也就是說a.c要引用到v,不只是取決於在a.c中宣告extern ...