C和C++的混合編譯--extern “C”的使用
參考地址:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html
在實際程式設計中,有時會需要用到C\C++的混合編譯,通過extern “C”即可實現混合編譯,以下是個人蔘照網友的資料以及自己的實際操作的收穫。
一:C++中呼叫C程式
圖片中print函式通過extern “C”來指明按照C的編譯方式來編譯,編譯完成執行結果如下:
二、在C中呼叫C++程式,分三個檔案進行
1、cppHeader.h檔案
2、cppHeader.cpp檔案
3.extern.c檔案,呼叫C++程式
4、編譯過程,編譯過程需要注意是C++按照C的編譯方式,所以最終生成的檔案是使用g++來進行編譯,Makefile如下:
5、最終執行程式extern,執行結果如下
三、C\C++的編譯和連結
C++是一個面嚮物件語言(雖不是純粹的面嚮物件語言),它支援函式的過載,過載這個特性給我們帶來了很大的便利。
為了支援函式過載的這個特性,C++編譯器實際上將void
print(
int
i);編譯為:_print_int
這樣的函式名,來唯一標識每個函式。注:不同的編譯器實現可能不一樣,但是都是利用這種機制。所以當連線是呼叫print(3)時,它會去查詢_print_int(3)這樣的函式。正是因為這點,過載被認為不是多型,多型是執行時動態繫結(“一種介面多種實現”),如果硬要認為過載是多型,它頂多是編譯時“多型”。
C++中的變數,編譯也類似,如全域性變數可能編譯g_xx,類變數編譯為c_xx等。連線是也是按照這種機制去查詢相應的變數。
C語言中並沒有過載和類這些特性,故並不像C++那樣print(int i),會被編譯為_print_int,而是直接編譯為_print等。因此如果直接在C++中呼叫C的函式會失敗,因為連線是呼叫C中的print(3)時,它會去找_print_int(3)。因此extern
"C"的作用就體現出來了。