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 不同編譯器採取的翻譯...