C/C++中extern的用法
--------------------------------------------------------------------------------
本文屬作者原創,如有轉載,請註明作者以及原址連結。
謝謝!
---------------------------------------------------------------------------------
1 基本解釋:
extern可以置於變數或者
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語言則不會,因此會造成連結時找不到對應函式的情況,這是我們就需要使用extern “C”來對C語言的函式進行限定,這時我們告訴編譯器,被extern "C"修飾的變數和函式是按照C語言方式編譯和連線的,不要給我生成用於連結的中間函式名;從而就不會出現上述的錯誤了。
一般我們用下面的程式碼來對C++和C語言進行區分。
#ifdef __cplusplus
extern "C"{
#endif
C函式/標頭檔案宣告;
#ifdef __cplusplus
}
上面這段程式碼的意思是:
__cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的程式碼,也就是說,上面的程式碼的含義是:如果這是一段cpp的程式碼,那麼加入extern "C"{}來處理其中的C函式/標頭檔案程式碼.