1. 程式人生 > >C/C++中extern的用法

C/C++中extern的用法

--------------------------------------------------------------------------------

本文屬作者原創,如有轉載,請註明作者以及原址連結。

謝謝!                                                                                        

---------------------------------------------------------------------------------

1 基本解釋:

  extern可以置於變數或者

函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。另外,extern也可用來進行連結指定。以上內容是baidu的。

2 extern用法:

extern都是對全域性變數而言的。

當你在main函式中定義了一個變數var時,該變數的作用域就是在main()函式中了,出了這個作用域,var就不起作用了,編譯時會出現undefined reference to的錯誤。如果想將變數var在其他函式或作用域中同樣可以使用,可將變數var宣告為全域性變數,這就用到了extern。

比如:

// test1.cpp 
int x = 10; 
// test2.cpp 注意在test2中並沒有沒有包含test1.cpp 
#include <iostream> 
using namespace std; 
extern int x;
int main ()
{
    cout << x << endl;
}
//輸出結果為10 

3 extern需要注意的地方:

當一個extern變數需要在多個cpp檔案中引用時,只需在一個地方使用extern宣告一下這個全域性變數即可,如果在多個檔案中同時使用extern進行宣告,程式在編譯時會出現multiple definition的錯誤。

A.cpp
#inlcude C.h
int i;
-----------------------
B.cpp
#include C.h
extern int i;
-----------------------
C.h
int i;

4 extern c用法:

C++之父在設計C++之時,考慮到當時已經存在了大量的C程式碼,為了支援原來的

C程式碼和已經寫好C庫,需要在C++中儘可能的支援C,而 extern "C"就是其中的一個策略。C++環境下可以對c的程式碼進行編譯。使用C函式的時候,常常會出現編譯器無法找到obj模組中的C函式定義,出現“undefined reference to”的錯誤,從而導致連結失敗的情況。

C++語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成一箇中間的函式名稱,而C語言則不會,因此會造成連結時找不到對應函式的情況,這是我們就需要使用extern “C”來對C語言的函式進行限定,這時我們告訴編譯器,extern "C"修飾的變數和函式是按照C語言方式編譯和連線的,不要給我生成用於連結的中間函式;從而就不會出現上述的錯誤了。

一般我們用下面的程式碼來對C++和C語言進行區分。

#ifdef __cplusplus
  extern "C"{
  #endif
  C函式/標頭檔案宣告;
  #ifdef __cplusplus
  }

上面這段程式碼的意思是:

__cpluspluscpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的程式碼,也就是說,上面的程式碼的含義是:如果這是一段cpp的程式碼,那麼加入extern "C"{}來處理其中的C函式/標頭檔案程式碼.