Linux下C呼叫C 介面詳解

2021-06-14 04:32:19 字數 2562 閱讀 8890

**:

c++做久了,經常用c++的方式去思考問題,有時候就突然發現自己不太會寫c程式了。寫程式的時候,難免會用到第三方外掛程式或者是庫,而這些外掛程式或者庫很多時候都不能完全滿足我們的需求,遇到這種情況,如果全是c++,那好辦,寫個介面卡就ok了,關於介面卡模式參考我的部落格《c++ adaptor 設計模式》    如果要提供給c程式使用,那就需要自己封裝c程式可以使用的庫。前幾天在csdn linux/unix版閒逛的時候,遇到一位網友,他問這樣的問題:(原話我記不住了,大致是這個意思)我要要封裝乙個c++介面提供給c程式使用,c++程式完全沒有問題,可以執行,但是封裝的時候,我使用g++編譯,就沒問題,但是預期的結果是使用gcc編譯程式,可是使用gcc編譯的時候確保錯,很多 undefined...我想熟悉linux程式設計的人一看這個問題都知道是怎麼回事。這裡我就不標新立異了,我只想總結下如果讓c呼叫c++介面

再將介面封裝之前先將建c/c++的一些特性有助於後面的理解。

c++創始人在編寫c++的時候,c語言正盛行,他不得不讓c++相容c。c++最大的特性就是封裝,繼承,多型,過載。而這些特性恰恰是c語言所不具備的。至於多型,核心技術是通過虛函式表實現的,其實也就是指標。而對於過載,與c語言相比,其實就是編譯方式不同而已: c++編譯方式和c編譯方式。對於函式呼叫,編譯器只要知道函式的引數型別和返回值以及函式名就可以進行編譯連線。那麼為了讓c呼叫c++介面或者是說c++呼叫c介面,就必須是呼叫者和被呼叫者有著同樣的編譯方式。這既是extern "c"的作用,extern 「c」是的程式按照c的方式編譯。我們先來看看c++和c兩種編譯方式對於究竟有何不同,由於c只考慮函式呼叫,這裡只討論函式的差別。下來看一段源**:

我們用乙個很簡短的**說明問題:

[cpp]view plain

copy

print?

//按照c++方式編譯程式

intoperation(

int)  

鍵入命令編譯cplus: g++ -c cplus.cpp -o cplus.o 產生了目標檔案cplus.o。我們來看看該目標檔案中的符號

使用nm命令檢視內部符號:nm cplus.o

內容很簡單:00000000 t _z9operationi

再來看看加 exern "c"按照c方式編譯程式:

[cpp]view plain

copy

print?

extern

"c"int

operation(

int)  

同樣使用上面的命令產生cplus.o。然後檢視符號如下:

00000000 t operation

對比下可以發現,使用c++方式編譯函式多了個_z9字首和i字尾,其中i指的是引數型別。這下明白了,因為c不存在過載,只需要知道函式名稱就可以確定函式,而c++有過載,需要根據引數型別和返回型別才可以唯一確定乙個函式。

說道這裡,大家估計已經理解的差不多了。提供給c的介面必須加 extern "c"。這裡還只是確定了編譯方式,extern "c"只能讓編譯器安c的方式編譯。但是c並不認識

extern "c",這裡還要加一道工序:在c檔案中 extern下介面。這樣c程式就認識介面函式了。下面以乙個簡單的例子來說明具體如何讓封裝c++介面給c使用。

[cpp]view plain

copy

print?

#include 

using

namespace

std;  

class

myclass  

~myclass(){}  

void

operation();  

};  

extern

"c"void

myclass::operation    

編譯命令:g++ -c myclass.cpp -o myclass.o

[cpp]view plain

copy

print?

#include "myclass.h"

void

inte***ce()    

編譯命令:g++ -c inte***ce.cpp -o inte***ce.o

這樣,其實介面就已經準備好了。一種方式是使用命令:ar rs libinte***ce.a inte***ce.o myclass.o產生靜態庫提供介面。

另一種方式是使用gcc,將呼叫程式的.o目標檔案和myclass.o, inte***ce.o一起編譯成可執行程式。

[cpp]view plain

copy

print?

extern

inte***ce();  

intmain(

intargc, 

char

**argv)    

編譯:gcc -c main.c -o main.o

:gcc -o main inte***ce.o myclass.o -lstdc++到此為止,介面已經提供完成。c程式中就可以使用inte***ce介面了。

C 呼叫C 介面

1 system.dllnotfoundexception 型別的未經處理的異常在 test.exe 中發生 其他資訊 無法載入 dll dll ar algorithm.dll 找不到指定的模組。異常來自 hresult 0x8007007e 該問題的原因是程式無法找到ar algorithm.d...

Linux下C程式設計 常用系統呼叫介面小結(2)

1 int fcntl int fd,int cmd,int arg 對已開啟的檔案描述符進行各種操作。2 char getwd char pathbuf char gectwd char pathbuf,size t size 確定呼叫程序當前工作目錄的絕對路徑名 3 int chdir cons...

C 介面詳解

使用關鍵字inte ce建立的資料型別。1 擴充套件乙個已有類的行為。2 規範不同型別的行為。1 介面是抽象的,介面是一組行為的抽象。介面只表達 能做什麼 不表達 如何做什麼 2 介面是規範,定義一組對外的行為規範。即實現類必須實現介面的所有成員。1 介面中不能包含字段,可以包含 行為 方法,屬性,...