C語言與C 語言相互呼叫

2021-09-20 00:22:07 字數 1715 閱讀 9763

1 c++呼叫c中的函式

1.1 c++呼叫c中的函式(正確使用)

1、案例原始檔組成

圖12、math模組包含檔案

1)原始檔math.c

圖22)標頭檔案math.h

圖33、主模組包含檔案

1)原始檔main.cpp

圖42)標頭檔案module.h

圖54、編譯math模組

圖65、編譯主模組

圖76、鏈結

圖8a圖8b

1.2 c++呼叫c中的函式(非正確使用)

1、案例原始檔組成

圖92、math模組包含檔案

1)原始檔math.c

圖102)標頭檔案math.h

圖113、主模組包含檔案

1)原始檔main.cpp

圖122)標頭檔案module.h

圖13圖13與圖5內容差異為:圖13遮蔽了exterrn 「c」 {}

4、編譯math模組

圖145、編譯主模組

圖15圖15與圖7中內容差異:圖7中的函式符號為add_func,而圖15中的函式符號為_z8add_funcii

因c++為物件導向語言,存在多型性,在編譯時會將函式引數型別和個數一併加入符號中,其中_z8add_funcii中的ii為表示有兩個引數,並且引數型別為integer型。

6、鏈結

圖162 c呼叫c++中的函式

2.1 c呼叫c++中的函式(正確使用)

1、原始碼結構

圖12、math模組

1)math.**件

圖22)math.cpp

圖33)編譯math模組

圖44)檢視math.o中符號內容

圖53、主模組

1)module.h

圖62)main.c

圖73)編譯主模組

圖84)檢視main.o中符號

圖94、鏈結(math.o和main.o)

圖102.2 c呼叫c++中的函式(非正確使用)

1、原始檔結構

圖12、math模組

1)math.**件

圖22)math.cpp檔案

圖3 3)編譯math模組

圖44)檢視math.o中的符號

圖53、主模組

1)module.h

圖62)main.c

圖73)編譯主模組

圖84)檢視main.o中符號

圖94、鏈結(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關鍵字。

--------------------- 

原文: 

go語言與c語言的相互呼叫

由於工作原因,需要實現go語言與c語言的相互呼叫。由於go語言與c語言有著千絲萬縷的曖昧關係,兩者之間的呼叫可以通過語言層面實現。下文是對此的總結。go語言呼叫c語言 以下為乙個簡短的例子 package main include include void print char str import...

ARM彙編 C語言 C 相互呼叫

1.匯程式設計序訪問c語言全域性變數 全域性變數只能通過位址間接呼叫,為了訪問c語言中全域性變數,首先要通過extern偽指令引入全域性變數,然後將其位址裝入暫存器中。對於unsigned char型別,使用ldrb strb訪問 對於unsigned short型別,使用ldrh strh訪問 對...

c語言和c 的相互呼叫

在實際專案開發中,c和c 的相互呼叫是常見的,c 能夠相容c語言的編譯方式,但是c 編譯器g 缺省會以c 的方式編譯程式,而c程式編譯器gcc會預設以c的方式編譯它,所以c和c 的相互呼叫存在一定的技巧。1.c方式編譯和c 方式編譯 一般.cpp檔案是採用g 去編譯,c檔案是採用gcc編譯,然而這不...