C C 中extern關鍵字詳解

2021-09-19 07:58:14 字數 3074 閱讀 9350

一.extern修飾變數和函式

在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。extern宣告不是定義,即不分配儲存空間。

先來看一段**

/*  basic_stdy.h */

#ifndef_basic_stdy_h_

#define_basic_stdy_h_

//extern int a; //在標頭檔案中宣告,必須加上extern,否則就是重定義

//void fun(); //不用加extern也可以

#endif

/* basic_stdy.cpp */

#include"basic_stdy.h"

#includeusing namespace std;

int a(2);

void fun()

也就是說,在乙個檔案中定義了變數和函式, 在其他檔案中要使用它們, 可以有兩種方式:

1.使用標頭檔案,然後宣告它們,然後其他檔案去包含標頭檔案

2.在其他檔案中直接extern

二.extern"c"作用

比如說你用c 開發了乙個dll 庫,為了能夠讓c ++語言也能夠呼叫你的dll 輸出(export) 的函式,你需要用extern 「c」 來強制編譯器不要修改你的函式名。

通常,在c 語言的標頭檔案中經常可以看到類似下面這種形式的**:

#ifdef __cplusplus  

extern "c"

#endif

1.現在要寫乙個c語言的模組,供以後使用(以後的專案可能是c的也可能是c++的),原始檔事先編譯好,編譯成.so或.o都無所謂。標頭檔案中宣告函式時要用條件編譯包含起來,如下:

#ifdef __cpluscplus  

extern "c"

#endif

也就是把所有函式宣告放在some code的位置。

2.如果這個模組已經存在了,可能是公司裡的前輩寫的,反正就是已經存在了,模組的.**件中沒有 extern 「c」 關鍵字,這個模組又不希望被改動的情況下,可以這樣,在你的c++檔案中,包含該模組的標頭檔案時加上extern 「c」, 如下:

extern "c"
3.上面例子中,如果僅僅使用模組中的1個函式,而不需要 include 整個模組時,可以不 include 標頭檔案,而單獨宣告該函式,像這樣:

extern "c"
第三點要注意:當單獨宣告函式時候, 就不能要標頭檔案,或者在標頭檔案中不能寫extern intthisistest(int a, int b);否則會有error c2732: 鏈結規範與「thisistest」的早期規範衝突,這個錯誤,

然後就可一使用模組中的這個thisistest函式了。

還有就是要注意在*.c檔案中不能寫成 extern 「c」 intthisistest(int x,int y);在c語言的標頭檔案中,對其外部函式只能指定為extern型別,c語言中不支援extern "c"宣告,在.c檔案中包含了extern "c"時會出現編譯語法錯誤。

extern"c"的使用要點

1.可以是單一語句

extern "c" double sqrt(double);
2.可以是復合語句,相當於復合語句中的宣告都加了extern"c"

extern "c"

3.可以包含標頭檔案,相當於標頭檔案中的宣告都加了extern"c"

extern"c"

4.不可以將extern"c"新增在函式內部

5.如果函式有多個宣告,可以都加extern"c",也可以只出現在第一次宣告中,後面的宣告會接受第乙個鏈結指示符的規則。

6.除extern"c",還有extern"fortran"等。

三.宣告和定義知識點

1.定義也是宣告,extern宣告不是定義,即不分配儲存空間。extern告訴編譯器變數在其他地方定義了。

//eg:

extern int i; //宣告,不是定義

int i; //宣告,也是定義

2.如果宣告有初始化式,就被當作定義,即使前面加了extern。只有當extern宣告位於函式外部時,才可以被初始化。

///eg:

extern double pi=3.1416; //定義

3.函式的宣告和定義區別比較簡單,帶有{}的就是定義,否則就是宣告。

//eg:

externdouble max(double d1, double d2); //宣告

doublemax(double d1, double d2){} //定義

4.除非有extern關鍵字,否則都是變數的定義。

//eg:

extern int i; //宣告

int i; //定義

注: basic_stdy.h 中有 char glob_str;

而 basic_stdy.cpp 有 char glob_str;

此時標頭檔案中就不是定義,預設為extern

程式設計風格:

1.不要把變數定義放入.**件,這樣容易導致重複定義錯誤。

2.盡量使用static關鍵字把變數定義限制於該原始檔作用域,除非變數被設計成全域性的。

3.可以在標頭檔案中宣告乙個變數,在用的時候包含這個標頭檔案就宣告了這個變數。

**:《c/c++中extern關鍵字詳解》

C C 中extern關鍵字用法詳解

extern用於在多個檔案中間中,定義乙個全域性變數或者函式。可以在其他檔案中使用 extern 來得到乙個已定義的變數或函式的引用。extern用於函式宣告時,和普通的函式宣告並沒有區別。即extern int foo 和int foo 是一樣的效果的。使用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 不同編譯器採取的翻譯...