1. 程式人生 > >C語言與C++語言相互呼叫

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