天天看點

C++如何調用C接口

前言

c++調用c檔案

原因分析

總結

解決調用失敗問題

思考:那c檔案能夠調用c函數嗎

c代碼既能被c++調用又能被c調用

如何在c++代碼中調用寫好的c接口?你可能會奇怪,c++不是相容c嗎?直接調用不就可以了,那麼我們來測試一下,先看看c++如何調用c代碼接口的。

一個c語言檔案test.c

一個頭檔案test.h

c++檔案調用c函數

執行指令

編譯後連結出錯:main.cpp對print(int, int)未定義的引用。

那麼g++編譯器為什麼找不到print(int,int)呢,其實在我們學c++重載的時候就提到過c++底層的編譯原理。

test.c我們使用的是c語言的編譯器gcc進行編譯的,其中的函數print編譯之後,在符号表中的名字為 print,通過nm檢視.o檔案.

我們連結的時候采用的是 g++ 進行連結,也就是 c++ 連結方式,程式在運作到調用 ​<code>​print​</code>​ 函數的代碼時,會在符号表中尋找 ​<code>​_z5printii​</code>​(是按照c++的連結方法來尋找的,是以是找 ​<code>​_z5printii​</code>​ 而不是找 ​<code>​print​</code>​)的名字,發現找不到,是以會提示“未定義的引用”

此時如果我們在對print的聲明中加入 extern “c” ,這個時候,g++編譯器就會按照c語言的連結方式進行尋找,也就是在符号表中尋找print(這才是c++相容c),這個時候是可以找到的,是不會報錯的。

編譯後底層解析的符号不同,c語言是 ​<code>​_print​</code>​,c++是 ​<code>​__z5printii​</code>​

修改test.h檔案

修改後再次執行指令

運作無報錯

實驗:定義main.c函數如下

重新執行指令如下

報錯:c語言裡面沒有extern “c“這種寫法

為了使得test.c代碼既能被c++調用又能被c調用

将test.h修改如下

​<code>​ps:下期介紹一個source insight的插件,快速生成上面的代碼​</code>​

再次執行指令

結果示意:

C++如何調用C接口

繼續閱讀