C 中extern關鍵字使用

2021-10-21 07:26:11 字數 2247 閱讀 7181

extern是乙個關鍵字,它告訴編譯器存在著乙個變數或者乙個函式,如果在當前編譯語句的前面中沒有找到相應的變數或者函式,也會在當前檔案的後面或者其它檔案中定義。

那麼定義在其他檔案中的函式和變數,如何通過extern關鍵字呼叫呢? 首先,定義在其它檔案中的函式和變數,可以使用兩種方法呼叫:

使用標頭檔案呼叫,這時候,函式和變數必須在標頭檔案中定義和宣告。

使用extern關鍵字呼叫,這時候函式和變數在.cpp或者.c檔案中定義和宣告。注意:如果乙個工程現編譯cpp檔案,在把多個目標檔案鏈結成為可執行檔案,而兩個或多個檔案中,定義了相同的全域性變數,那麼,程式編譯的時候不會報錯,因為編譯器單獨編譯每個檔案,在鏈結可執行檔案的時候,由於多個目標檔案中含有相同的全域性變數,而生成可執行檔案的時候,任何檔案中定義的全域性變數對其它目標檔案都是可見的,此時由於變數定義衝突而發生錯誤。參考如下**

#include "example.h"

#include

using namespace std;

int i;

extern int fun

(int)

;//這裡extern是必須的,函式定義在別的cpp檔案中

#include "example.h"

#include

using namespace std;

int i;

int func

(int a)

單獨compile任何乙個cpp檔案都是對的,但是 編譯工程,生成可執行檔案的時候報錯。原因是:兩個.cpp檔案中都定義了全域性變數i,變數重複定義了。

注意:定義在.**件中的函式和變數不能使用extern變數宣告,原因是#include 在預編譯的時候將.**件中的內容插入了cpp檔案中,因此編譯器找得到在其它.**件中定義的變數或者函式。編譯的時候,只編譯cpp檔案的內容,.**件時不參與編譯,如果使用extern宣告在.**件中定義的變數或者函式,那麼宣告為extern的變數和函式在其它.cpp檔案中找不到,因此程式編譯的時候就發生了錯誤。

1.在c++檔案中編譯c檔案需要使用extern "c"關鍵字,**如下:

方法1:全域性函式和變數在example1.c檔案中實現,在example2.cpp檔案中使用extern關鍵字宣告在example1.c檔案中定義的函式和變數。

// example1.c 

#include

int i;

void

func()

// example2.cpp

#include

#include

using namespace std;

extern "c"

int main

(void

)}

方法2:在example1.**件中實現c**(即example1.h作為c語言標頭檔案),在.cpp檔案中包含c語言標頭檔案。

// example1.h

#include

int i;

int func

(int a)

// example2.cpp

#include

#include

using namespace std;

extern "c"

int main

(void

)}

2.c呼叫c++編寫的**

需要在example1.cpp中,明確呼叫extern "c"關鍵字,宣告cpp檔案中有關**,需要按照c的方式來生成,修改example1.cpp檔案如下所示:

// example1.cpp

#include

int i;

extern "c" int func

(int a)

此時,除了需要使用extern "c"宣告編譯的時候採用c方式編譯外,.cpp檔案中的**可以按照c++方式編寫。

// example2.cpp

#include

extern int i;

extern int func()

; int main

(void

)}

關鍵字 extern 使用

在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。能夠被其他模組以extern修飾符引...

C C 中extern關鍵字

extern關鍵字可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。另外,extern也可用來進行鏈結指定。在介紹外部變數之前,先來看一下什麼是區域性變數。下面是乙個例子。include define maxline 1000 int ...

C C 中extern關鍵字

當extern與 c 一起連用時,如 extern c void fun int a,int b 這就告訴編譯器在編譯fun這個函式名時按著c的規則去翻譯相應的函式名而不是c 的,c 的規則在翻譯這個函式名時會把fun這個名字弄得面目全非,例如 fun abc isdnfsdf 不同編譯器採取的翻譯...