extern關鍵字的含義是什麼?
- extern是C/C++語言中代表函數和全局變量做用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量能夠在本模塊或其它模塊中使用。
extern關鍵字的通常用法是怎樣的?
- 在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變量以關鍵字extern聲明。
- 例如,若是模塊B欲引用該模塊A中定義的全局變量和函數時只需包含模塊A的頭文件便可。這樣,模塊B中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,可是並不會報錯;它會在link階段時從模塊A編譯生成的目標代碼中找到此函數
Extern "C"的意義
- extern "C"是連接申明(linkage declaration),被extern "C"修飾的變量和函數是按照C語言方式編譯和鏈接的
C++中對相似C的函數時如何編譯的?
- 做爲一種面向對象的語言,C++支持函數重載,而過程式語言C則不支持。函數被C++編譯後在符號庫中的名字與C語言的不一樣。
- 例如,假設某個函數的原型爲:void foo( int x, int y ); 該函數被C編譯器編譯後在符號庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不一樣的編譯器可能生成的名字不一樣,可是都採用了相同的機制,生成的新名字稱爲「mangled name」)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。
例如,在C++中,函數 void foo( int x, int y )與void foo( int x, float y )編譯生成的符號是不相同的,後者爲 _foo_int_float。一樣地,C++中的變量除支持局部變量外,還支持類成員變量和全局變量。用戶所編寫程序的類成員變量可能與全局變量同名,咱們以"."來區分。而本質上,編譯器在進行編譯時,與函數的處理類似,也爲類中的變量取了一個獨一無二的名字,這個名字與用戶程序中同名的全局變量名字不一樣。編程
未加extern "C"聲明時的鏈接方式,在鏈接階段,鏈接器會從模塊A生成的目標文件moduleA.obj中尋找_foo_int_int這樣的符號!函數
加extern "C"聲明後的編譯和鏈接方式
在模塊B的實現文件中仍然調用foo( 2,3 ),其結果是:模塊A編譯生成foo的目標代碼時,沒有對其名字進行特殊處理,採用了C語言的方式;對象
連接器在爲模塊B的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo。
若是在模塊A中函數聲明瞭foo爲extern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數;反之亦然。原型
一句話歸納extern 「C」 聲明的真實目的