前言
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>
再次執行指令
結果示意: