1. 程式人生 > >C和C++的混合編譯--extern “C”的使用

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++編譯器實際上將voidprint(inti);編譯為:_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"的作用就體現出來了。