C語言與C++語言相互呼叫
C語言與C++語言相互呼叫
1 C++呼叫C中的函式
1.1 C++呼叫C中的函式(正確使用)
1、案例原始檔組成
圖1
2、math模組包含檔案
1)原始檔math.c
圖2
2)標頭檔案math.h
圖3
3、主模組包含檔案
1)原始檔main.cpp
圖4
2)標頭檔案module.h
圖5
4、編譯math模組
圖6
5、編譯主模組
圖7
6、連結
圖8a
圖8b
1.2 C++呼叫C中的函式(非正確使用)
1、案例原始檔組成
圖9
2、math模組包含檔案
1)原始檔math.c
圖10
2)標頭檔案math.h
圖11
3、主模組包含檔案
1)原始檔main.cpp
圖12
2)標頭檔案module.h
圖13
圖13與圖5內容差異為:圖13遮蔽了exterrn “C” {}
4、編譯math模組
圖14
5、編譯主模組
圖15
圖15與圖7中內容差異:圖7中的函式符號為add_func,而圖15中的函式符號為_Z8add_funcii
因C++為面嚮物件語言,存在多型性,在編譯時會將函式引數型別和個數一併加入符號中,其中_Z8add_funcii中的ii為表示有兩個引數,並且引數型別為integer型。
6、連結
圖16
2 C呼叫C++中的函式
2.1 C呼叫C++中的函式(正確使用)
1、原始碼結構
圖1
2、math模組
1)math.h檔案
圖2
2)math.cpp
圖3
3)編譯math模組
圖4
4)檢視math.o中符號內容
圖5
3、主模組
1)module.h
圖6
2)main.c
圖7
3)編譯主模組
圖8
4)檢視main.o中符號
圖9
4、連結(math.o和main.o)
圖10
2.2 C呼叫C++中的函式(非正確使用)
1、原始檔結構
圖1
2、math模組
1)math.h檔案
圖2
2)math.cpp檔案
圖3
3)編譯math模組
圖4
4)檢視math.o中的符號
圖5
3、主模組
1)module.h
圖6
2)main.c
圖7
3)編譯主模組
圖8
4)檢視main.o中符號
圖9
4、連結(math.o和main.o)
圖10
3 總結
C++保留了一部分過程式語言特點,因此可以定義不屬於任何類的全域性變數和函式;但是C++為面嚮物件語言,支援函式的過載,C++對全域性函式處理方式明顯與C不同。extern “C”{}目的是為了讓C++正確使用C的程式碼,加上extern “C”{}之後,會指示編譯器對這部分程式碼按照C語言進行編譯,而不是C++。C++支援多型,因此編譯過程中會將函式的引數型別合入函式名符號中,而不僅僅是函式名。
__cplusplus為cpp中自定義的巨集,extern表明變數和函式是全域性性的。
主意:
1)C++呼叫一個C語言編寫的.so庫時,包含描述.so庫中函式的標頭檔案時,應該將對應的標頭檔案放置在extern “C”{}格式的{}中,。
2)C中引用C++中的全域性函式時,C++的標頭檔案需要加extern “C”,而C檔案中不能用extern “C”,只能使用extern關鍵字。