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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章