C++中的extern關(guān)鍵字是什么意思?怎么用?

extern關(guān)鍵字在c++++中用于聲明變量或函數(shù)在別處定義。①用于全局變量的跨文件使用,如在file2.cpp用extern int globalvar;引用file1.cpp中定義的int globalvar = 10;②用于函數(shù)聲明,默認(rèn)可省略,但顯式添加可增強(qiáng)代碼意圖表達(dá);③通過(guò)extern “c”實(shí)現(xiàn)c與c++的兼容,關(guān)閉c++的名字改編機(jī)制以確保正確鏈接;此外需注意extern const變量的聲明與定義區(qū)別,以及頭文件與源文件中的合理分布,避免違反odr原則導(dǎo)致鏈接錯(cuò)誤。

C++中的extern關(guān)鍵字是什么意思?怎么用?

在C++中,extern關(guān)鍵字的作用是聲明一個(gè)變量或函數(shù)是在別處定義的,告訴編譯器“這個(gè)東西我用到了,但它不是在這里定義的,你去別的地方找找”。

它主要用于解決多個(gè)源文件之間共享全局變量或函數(shù)的問(wèn)題。下面我們就來(lái)看看它的幾種常見(jiàn)用法。


extern用于全局變量的聲明

當(dāng)你在一個(gè)文件中定義了一個(gè)全局變量,想在另一個(gè)文件中使用它時(shí),就需要用extern來(lái)聲明。

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

比如:

// file1.cpp int globalVar = 10;
// file2.cpp extern int globalVar; // 聲明globalVar是在別處定義的  void printGlobal() {     std::cout << globalVar << std::endl; }

如果不加extern,直接寫(xiě)int globalVar;會(huì)被當(dāng)作一個(gè)新的定義,鏈接時(shí)可能會(huì)出錯(cuò)。而加上extern后,就只是告訴編譯器:“我知道這貨存在,但別在這兒分配空間。”


extern用于函數(shù)聲明(其實(shí)可以省略)

對(duì)于函數(shù)來(lái)說(shuō),extern其實(shí)是默認(rèn)存在的。例如:

// file1.cpp void foo() {     // do something }
// file2.cpp extern void foo(); // 其實(shí)也可以直接寫(xiě)成 void foo();  void callFoo() {     foo(); }

因?yàn)楹瘮?shù)默認(rèn)就是外部鏈接的,所以加不加extern效果一樣,但為了清晰表達(dá)意圖,有時(shí)還是會(huì)加上。


extern “C”:用來(lái)兼容c語(yǔ)言代碼

這是extern一個(gè)非常重要的用途。如果你在C++里調(diào)用C語(yǔ)言寫(xiě)的庫(kù),或者希望你的C++函數(shù)能被C調(diào)用,就需要用到extern “C”。

C++有函數(shù)重載機(jī)制,會(huì)進(jìn)行名字改編(name mangling),而C沒(méi)有。這樣會(huì)導(dǎo)致C++編譯出來(lái)的函數(shù)名和C的不一樣,鏈接時(shí)就會(huì)找不到符號(hào)。

解決方法就是用extern “C”來(lái)關(guān)閉C++的名字改編機(jī)制:

extern "C" {     void c_style_func(); // 這個(gè)函數(shù)將按照C的方式命名 }

如果是引用C語(yǔ)言頭文件,通常寫(xiě)成這樣:

extern "C" { #include "c_header.h" }

這樣就能確保這些函數(shù)以C風(fēng)格導(dǎo)出或?qū)搿?/p>


小細(xì)節(jié)提醒

  • extern const int x; 和 extern const int x = 5; 是不一樣的:

    • 前者只是一個(gè)聲明;
    • 后者則是定義并初始化,此時(shí)不能在其它文件再重復(fù)定義。
  • extern只負(fù)責(zé)聲明,真正的定義只能出現(xiàn)一次(ODR原則)。

  • 在頭文件中通常放extern變量的聲明,而在某個(gè).cpp文件中做實(shí)際定義。


基本上就這些了。雖然extern看起來(lái)簡(jiǎn)單,但在多文件項(xiàng)目中搞清楚變量和函數(shù)的定義與聲明關(guān)系,對(duì)避免鏈接錯(cuò)誤非常重要。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享