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關鍵字。