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

C ++ extern "C"的用法

   在C++的很多程式碼中,我們經常看到有extren "C"的程式碼片段,很多人並不清楚其中的含義。而且,我們在C/C++中還會經常看到一個關鍵字,extren。因此,這樣造成了很多的用法和理解上的混淆。

    我們先說一下extren關鍵字,這個關鍵字在C中就已經存在了,它是用來修飾一個變數的。例如:extren const int m_val;這是告知編譯器,該變數已經在其他檔案中有所定義,此處是將其進行宣告擴充套件,以便於這個變數在當前檔案的使用。這種用法也是為了方便模組間的通訊。

    再說,extren “C”,當這兩個關鍵字進行組合的時候,它會有兩個用法。

    1.告知編譯器,當前的函式或物件,以C語言的方式進行編譯和執行。之所以如此,是因為C++在C語言的基礎上,對c 語言的庫函式進行了進一步的封裝。而我們需要在C++的程式碼中用到C語言的庫函式。因此,通過該方式可以相容C語言程式碼。

    2.告知編譯器,當前函式不要偷換函式名。何意?因為C++中有一個函式名過載機制,即相同的函式名,不同的引數列表,用以實現接近的功能。而所謂的相同的函式名,其實是為了方便程式設計師閱讀理解,在C++編譯器中,都會對函式名進行新增符號。例如:

int Add(int a,int b);//在編譯之後,函式名可能為 Add_fun_a_b.
int Add(float a,float b);//在編譯之後,函式名可能為Add_fun_floatab;

    當我們不希望編譯器將函式名更改時,則引入extren "C"。即告知編譯器,被修飾的函式,在編譯之後,函式名仍然不被修改。

    當然,第二種在實際使用中並不常見,而在一些dll的編寫過程中,則是大量的出現。

    為什麼會有這種需求呢?這就不得不稱讚C++設計者的高明和靈活之處了。由於編譯器廠商的不同,對C++的實現方式也有不同。不同的編譯器對相同的函式名過載的規則略有不同,即編譯之後的函式名會不同。而對於dll而言,我們需要相容不同的編譯器,所以阻隔掉因編譯器型別不同,而造成的函式入口無法正確定位的問題。所以,才會有這種的使用方式。