externc鏈接指示符與c和c接口建立方法_第1頁
externc鏈接指示符與c和c接口建立方法_第2頁
externc鏈接指示符與c和c接口建立方法_第3頁
externc鏈接指示符與c和c接口建立方法_第4頁
externc鏈接指示符與c和c接口建立方法_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、externc鏈接指示符與c和c+接口的建立方法許久以前寫的了,素來忘了貼上來了今天看ORACLE煩了,有時間貼上來前言:昨天腦子一熱問了一個很easy的問題,結果把自己都弄糊涂了,惹來好手們的癡笑,回頭想一想是個很簡單的問題,卻想了那么多,暈!今天做個總結吧!(:-鏈接指示符(linkagedirective)extern“C”的問題:若是我們在自己的程序中要用到其他語言所編寫的函數(shù),那么我們的調用函數(shù)就必定告訴編譯器使用不相同的要求。因為函數(shù)在函數(shù)名的生成,參數(shù)的入棧,棧的清空等等方面與所使用的語言是親近相關的。Linkagedirector告訴編譯器,該函數(shù)是用其他的程序設計語言編寫的。

2、Linkagedirector有兩種形式:1單一的語句(singlestatement)形式:extern“C”voidexit(int);2.復合的語句(compoundstatement)形式:extern“C”intprintf(constchar*.);intscanf(constchar*.);或:extern“C”#include這里可是一個切割符,用來說明在那個鏈接指示符用在那些聲明上,沒有其他的意義了,也就是說在花括號內聲明的函數(shù)是可見的了!不要癡人說夢!extern“XX”可以告訴編譯器,該函數(shù)是用其他語言來編寫的,但逼迫這些函數(shù)采用XX語言的方式進行編譯。舉個例子說吧!C接

3、口的方法:C中調用C+函數(shù):生成一個工程叫demo加入一個demo.c內容以下:intadd(inta,intb);/有無都可intmain()inti=add(3,2);printf(i=%d,i);return0;再加入一個add.cpp,(注意擴展名,逼迫控制臺生成兩種文件種類)內容以下:intadd(inta,intb)returna+b;若是這樣編譯的話,會產生下面的錯誤:Linking.demo.obj:errorLNK2001:unresolvedexternalsymbol_addDebug/demo.exe:fatalerrorLNK1120:1unresolvedexter

4、nalsErrorexecutinglink.exe依照提示說是沒有找到-add,可是我顯然定義了!.為了搞清這個這個問題,就要搞清楚終歸C的函數(shù)和CPP的函數(shù)在編譯此后,會變成何樣子!C+支持重載,C中不支持,而C+怎么區(qū)分這些重載函數(shù)呢,終歸調用那下一個呢?C+會能過不相同的參數(shù)來選擇不相同的擁有相同名稱的不相同的實現(xiàn)函數(shù)的調用。C+函數(shù)被編譯今后,函數(shù)會附加一些附加的參數(shù)信息!我們以實事說話:在add.cpp中再加入一個同名函數(shù)實現(xiàn)重載floatadd(floatfa,floatfb)returnfa+fb;intadd(inta,intb)returna+b;單獨編譯此文件沒有問題!輸

5、出一個map文件,找到add函數(shù):AddressPublicsbyValueRva+BaseLib:Object0001:00000030_main00401030fdemo.obj0001:00000080?addYAMMMZ00401080fadd.OBJ0001:000000b0?addYAHHHZ004010b0fadd.OBJ理解了吧!精華都在這里了!提示說找不到_add,原來是在C語言被編譯過程中,自動加上了下畫線了!看看main就知道了!而在C+中,函數(shù)被擴展了,?addYAMMMZ,前面兩個相當于左括號,后邊一個相當于右括號,中間的就是用來表示參數(shù)的了!簡單吧!兩個重載函數(shù)使用

6、了不相同的參數(shù),一個是整數(shù),一個是浮點數(shù),當這兩個函數(shù)進行連接時,在相應的C+的連接過程中,編譯器也會以編譯出來的名字到對應的OBJ文件中查找。在C+編譯中,會把參數(shù)的種類,名字和函數(shù)的名字組合成為一個新的函數(shù),這樣就和程序定義的函數(shù)名這相一致!在在看看錯誤提示,我們的輸出文件中也找不到這個現(xiàn)_add,所以程序不可以能連接上。知道原因就解決吧!最直接的方法就是更正C+文件的編譯結果,讓它產生一個對應C的函數(shù)名字,也就是按C的方法來生成對應的函數(shù)。在C+的頭文件中加入:externCintadd(inta,intb);extern“C”語句的作用就是把C+函數(shù)按C約定編譯!運行,OK!Addre

7、ssPublicsbyValueRva+BaseLib:Object0001:00000030_main00401030fdemo.obj0001:00000080?addYAMMMZ00401080fadd.obj0001:000000b0_add004010b0fadd.obj變了吧!那么C+中調用C呢!由于兩者之間的關系,C+中可以說是直接調用就可以了!不過這是有條件的!把demo.c改成:intsubstract(inta,intb)returna-b;voidhello()printf(hello);add.cpp改為:voidhello();intsubstract(inta,in

8、tb);intmain()hello();intc=substract(4,1);printf(c=%d,c);return0;編譯運行,出現(xiàn)了前一次相同的錯誤:加上externCvoidhello();intsubstract(inta,intb);就OK了!這是兩者的map比較:0001:00000030_substract00401030fdemo.obj0001:00000060_hello00401060fdemo.obj0001:00000030_substract00401030fdemo.obj0001:00000060_hello00401060fdemo.obj發(fā)現(xiàn)是相同的!問題在于你在add.cpp前面加入了:voidhello();intsubstract(inta,intb);這樣就把兩個函數(shù)編譯成了C+方式,去找它的實現(xiàn)代碼的時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論