首先extern 「c」是一句申明語句,它的意思是告訴編譯器用c的規則去編譯該申明語句後的內容,一般都是申明函式。
我們都知道c++具有函式過載的功能,比如說某個檔案包含下面這兩個函式
int foo(int a)
int foo(double a)
它們的函式名都長得一樣,但是引數型別不一樣。
如果該檔案是.c檔案,用gcc來編譯就編不過,但是如果該檔案是.cpp檔案的話,用g++就可以編譯鏈結成功生成執行檔案。
這是因為,gcc在編譯生成符號表的時候這兩個函式的符號一模一樣,所以鏈結不會成功,但是g++在編譯生成符號表的時候,上面兩個函式生成的符號是有區別的,這是因為g++為函式生成符號的時候,不僅僅是根據該函式的函式名,還根據了函式的返回型別和入參型別以及個數,所以在鏈結的時候就符號表中就不會存在衝突。
而g++的這一特性也就是c++函式過載的實現依賴。
目前我所遇到的應用場合有兩個(能力有限,歡迎補充:-d)
當我們以動態庫的形式做乙個外掛程式給使用者使用,使用者如要使用外掛程式中某一功能就得通過dlsym庫函式去在外掛程式中找到然後返回給使用者,而查詢這一過程就是根據函式名去查詢的,如果我們用c++的規則去編譯生成該外掛程式,那麼我們很難知道最後編譯後函式在符號表中對應的符號到底長什麼樣子,而使用extern 「c」申明外掛程式中所有的功能函式之後,我就可以直接用函式名去查詢了。
當我們用g++的類封裝了某乙個應用,底層想通過系統指令碼去啟動它時也會用到這個宣告。
因為底層的系統都是用c寫的,當呼叫乙個函式時僅僅是根據該函式名去符號表中去找,因為它不具有函式過載的功能,所以不能像c++那樣根據返回值和入參去查詢對應的函式。
所以在應用層中,我們需要乙個用c規則編譯的函式來操作這個封裝好的應用,然後底層系統就可以通過這個函式去啟動這個用c++編譯的應用了。
extern 「c」 不能編寫在.c檔案中,否則會出現如下錯誤提示
expected identifier or 『(』 before string constant extern 「c」 {
traits的應用場合
模板 泛型 實際上就是巨集定義乙個型別,此型別是乙個通用型別 故又叫泛型 把具體型別 包括指標型別 帶入進去就會形成乙個新的型別。下面是代入時兩種編譯錯誤的解決方法 一 模板 泛型 具型成 int valuetype 時 代入基本型別 這顯然編譯不過,就像下面這樣偏特化處理 my type trai...
I O復用的應用場合
i o復用 select poll 典型使用在下列網路應用場合 1 當客戶處理多個描述字 通常是互動式輸入和網路套介面 時,必須使用i o復用。2 乙個客戶同時處理多個套介面是可能的,不過比較少見。3 如果乙個tcp伺服器既要處理監聽套介面,又要處理已連線的套介面,一般就要使用i o復用。4 如果乙...
oracle跳躍索引的應用場合
索引跳躍式掃瞄 index skip scan 是oracle9i的乙個新的執行特性,尤其適用於使用連線索引和訪問多值索引的oracle查詢。根據 索引跳躍式掃瞄 index skip scan 是oracle9i的乙個新的執行特性,尤其適用於使用連線索引和訪問多值索引的oracle查詢。讓我們看以...