青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個(gè)人技術(shù)空間
獲得人生中的成功需要的專(zhuān)注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

 

C中如何調(diào)用C++函數(shù)?

 

前陣子被問(wèn)及一個(gè)在C中如何調(diào)用C++函數(shù)的問(wèn)題,當(dāng)時(shí)簡(jiǎn)單回答是將函數(shù)extern "C"聲明,當(dāng)被問(wèn)及如何將類(lèi)內(nèi)成員函數(shù)聲明時(shí),一時(shí)語(yǔ)塞,后來(lái)網(wǎng)上查了下,網(wǎng)上有一翻譯C++之父的文章可以作為解答,遂拿來(lái)Mark一下。

 

C++ 函數(shù)聲明為``extern "C"''(在你的 C++ 代碼里做這個(gè)聲明),然后調(diào)用它(在你的 C 或者 C++ 代碼里調(diào)用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

 

然后,你可以這樣使用 f()

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

    }

 

當(dāng)然,這招只適用于非成員函數(shù)。如果你想要在 C 里調(diào)用成員函數(shù)(包括虛函數(shù)),則需要提供一個(gè)簡(jiǎn)單的包裝(wrapper)。例如:

// C++ code:

class C

{

       // ...

       virtual double f(int);

};

 

extern "C" double call_C_f(C* p, int i) // wrapper function

{

       return p->f(i);

}

 

然后,你就可以這樣調(diào)用 C::f()

/* C code: */

double call_C_f(struct C* p, int i);

 

void ccc(struct C* p, int i)

{

       double d = call_C_f(p,i);

       /* ... */

}

 

如果你想在 C 里調(diào)用重載函數(shù),則必須提供不同名字的包裝,這樣才能被 C 代碼調(diào)用。例如

// C++ code:

void f(int);

void f(double);

 

extern "C" void f_i(int i) { f(i); }

extern "C" void f_d(double d) { f(d); }

 

然后,你可以這樣使用每個(gè)重載的 f()

/* C code: */

void f_i(int);

void f_d(double);

 

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

       /* ... */

}

注意,這些技巧也適用于在 C 里調(diào)用 C++ 類(lèi)庫(kù),即使你不能(或者不想)修改 C++ 頭文件。

 該翻譯的文檔Bjarne Stroustrup的原文鏈接地址是

http://www.research.att.com/~bs/bs_faq2.html#callCpp

本來(lái)貼出來(lái)以后受到很多C/C++朋友的關(guān)注,非常榮幸,在“夢(mèng)在天涯”的提醒下,本人后來(lái)又完成了一個(gè)Demo工程,發(fā)現(xiàn)和BJ說(shuō)的有點(diǎn)出入,希望有高手指點(diǎn),Demo工程下載鏈接如下:http://www.shnenglu.com/Files/franksunny/cCallCppDemo.rar

 

 

posted on 2007-11-29 20:38 frank.sunny 閱讀(60733) 評(píng)論(21)  編輯 收藏 引用 所屬分類(lèi): C/C++學(xué)習(xí)和實(shí)踐

FeedBack:
# re: C中如何調(diào)用C++函數(shù)
2007-11-29 22:23 | helixapp
基礎(chǔ)知識(shí) 居然還是BJ.S的 頂一下!  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-11-29 22:26 | helixapp
怎么老是說(shuō)驗(yàn)證碼錯(cuò)誤 btw B.J 好像不喜歡別人叫他B.J :>  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-11-30 09:36 | 金慶
雖然不怎么方便,可是還是有用的。  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2007-11-30 10:11 | kkk
他喜歡bs......  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-11-30 11:25 | 攀升
之所以這樣寫(xiě)是因?yàn)镃++和C鏈接后的的函數(shù)名發(fā)生了不同的變化,
而extern "C" double call_C_f(C* p, int i) // wrapper function
就告訴了C++編譯器在編譯在編譯該函數(shù)時(shí)以C的格式來(lái)
蠻好的,我倒沒(méi)總結(jié)的這么全面。
  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-11-30 14:48 | 夢(mèng)在天涯
寫(xiě)是這么寫(xiě),但是用的時(shí)候那,直接#include頭文件嗎,還需要其他的工作嗎,最好來(lái)個(gè)實(shí)例!

前些天C++群里有人問(wèn),好像大家都不會(huì)哦!

希望共享哦!  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2007-11-30 18:14 | hdqqq
extern "C" 之后,就不能重載函數(shù)了,關(guān)鍵還是函數(shù)名修飾的問(wèn)題.  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-11-30 21:01 | frank.sunny
@夢(mèng)在天涯
不知道怎么通知你,已經(jīng)有個(gè)實(shí)例了,非常感謝你的指出,否則我就那么蒙混過(guò)去了

同時(shí)感謝大家的關(guān)注,希望對(duì)實(shí)例工程提出更多想法。  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2007-12-01 14:58 | lymons
這種方法 得修改要調(diào)用函數(shù)的C++的源代碼文件,在里面添加一個(gè)給C的接口函數(shù)才可以。

但是在大多數(shù)的C開(kāi)發(fā)里,我們往往是看不到要調(diào)用的C++的代碼,
或者說(shuō)對(duì)方只給你提供C++的庫(kù)的二進(jìn)制代碼的時(shí)候,這個(gè)時(shí)候該怎么辦呢?
  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-03 09:21 | 夢(mèng)在天涯
frank,有實(shí)例,哦,那里哦,可以把地址發(fā)這里哦

也可以加我的msn哦,mzty999@hotmail.com

  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-03 09:22 | 夢(mèng)在天涯
哦,看到了,不好意思哦,demo的地址的文章的最后哦!  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-03 09:30 | 夢(mèng)在天涯
恩,代碼不錯(cuò),如果能分開(kāi)2個(gè)project,一個(gè)是C的client和一個(gè)C++的DLL,這樣調(diào)用的話(huà)就更能表達(dá)清楚問(wèn)題了!  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-05 16:06 | wu
不知道在Linux下是否也能這樣處理,而且作者沒(méi)有提到編譯的問(wèn)題,而我看到的其他相關(guān)資料提到了使用動(dòng)態(tài)鏈接庫(kù)使用c++函數(shù)的方法,核心也是用extern "c",不知道兩者是否是一致的呢?順便問(wèn)一下,作者的demo可以編譯通過(guò)了嗎?
  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-07 15:39 | Merlin Ran
1、C的程序擴(kuò)展名應(yīng)該是.c,否則VC就把當(dāng)它C++來(lái)編譯了,達(dá)不到演示的效果。
2、編譯的錯(cuò)誤消息是什么?我用VC6+SP6是沒(méi)有任何問(wèn)題的。
3、其實(shí)加extern "C"就是防止編譯器對(duì)函數(shù)名做變換。在VC下,可以用dumpbin看生成的obj文件,加上extern "C"和不加,函數(shù)名的區(qū)別。  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2007-12-08 16:00 | frank.sunny
@Merlin Ran
其實(shí)你所提到的問(wèn)題,我老早就想到了,但是之前編譯通不過(guò),具體代碼在此鏈接下,錯(cuò)誤消息你自己編譯看看吧,我不知道你是怎么編譯通過(guò)的,如果你編譯通過(guò)了,最好可以給份代碼在我郵箱里可以嗎?
http://www.shnenglu.com/Files/franksunny/cCallCppDemoErr.rar

我的郵箱:frank.sunny@163.com
  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2008-04-14 10:02 | david_fluid@msn.com
求教,我看了一下,你寫(xiě)的demo是沒(méi)有類(lèi)成員變量的情況,如果有的話(huà),用 p->f(i) 這是p指針為NULL 怎么解釋?zhuān)?nbsp; 回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2008-04-15 14:48 | frank.sunny
@david_fluid@msn.com

沒(méi)看明白你的意思,沒(méi)有設(shè)置類(lèi)的實(shí)例對(duì)象,自然是NULL的啊,你想它的值是多少啊?
而且本實(shí)現(xiàn)call_C_f_i和call_C_f_d只是一個(gè)接口函數(shù)  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2008-12-12 12:33 | leon
在demo代碼里為什么用cCallCppDemo.cpp,我用cCallCppDemo.c編譯失敗,在設(shè)置里c/c++設(shè)置為不使用預(yù)編譯頭也是失敗,提示warning C4013: 'call_C_f_i' undefined; assuming extern returning int  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2008-12-12 12:39 | leon
試了下可以了,把extern "C"改成extern就行了  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)[未登錄](méi)
2011-09-07 14:28 | 靈魂
非常感謝您詳細(xì)的講解。
可是在您的例子里,main函數(shù)還是在cpp文件出現(xiàn)的,要是改成C文件就編譯不過(guò)去了。會(huì)顯示class這里編譯不過(guò)去。  回復(fù)  更多評(píng)論
  
# re: C中如何調(diào)用C++函數(shù)
2012-01-06 12:29 | sssw
如此用C調(diào)用C++函數(shù)的意義何在?失去了面向?qū)ο蟮幕咎卣鳎皇前褌€(gè)C++函數(shù)當(dāng)C函數(shù)用而已。  回復(fù)  更多評(píng)論
  

常用鏈接

留言簿(13)

隨筆分類(lèi)

個(gè)人其它博客

基礎(chǔ)知識(shí)鏈接

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲毛片在线看| 亚洲丶国产丶欧美一区二区三区 | 亚洲精品一区久久久久久| 欧美黄色视屏| 欧美日韩ab| 欧美一区2区三区4区公司二百| 欧美亚洲网站| 亚洲精品乱码久久久久久黑人| 亚洲欧洲视频在线| 国产精品美女久久| 久久久亚洲国产美女国产盗摄| 老司机精品视频网站| 日韩一区二区高清| 亚洲综合精品| 亚洲国产高潮在线观看| 亚洲黄色一区| 久久久久女教师免费一区| 亚洲高清网站| 夜夜嗨av色综合久久久综合网| 国产日韩欧美精品综合| 免费成人高清在线视频| 欧美精品久久久久a| 欧美亚洲在线视频| 免费亚洲婷婷| 久久国产视频网| 欧美高清hd18日本| 欧美中文字幕在线视频| 欧美激情久久久久久| 欧美一区二区三区在线| 欧美极品aⅴ影院| 欧美与黑人午夜性猛交久久久| 看片网站欧美日韩| 欧美一级专区| 欧美日韩国产欧| 欧美暴力喷水在线| 国产亚洲福利社区一区| 一本色道久久综合一区| 在线免费高清一区二区三区| 亚洲视频第一页| 日韩亚洲国产欧美| 久久先锋资源| 久久久久久久999| 国产精品国产三级国产aⅴ浪潮| 欧美粗暴jizz性欧美20| 国产一区二区三区久久| 亚洲天堂网在线观看| 亚洲美女中出| 美女精品在线观看| 欧美1区2区| 尤物九九久久国产精品的分类| 亚洲在线1234| 亚洲欧美在线播放| 欧美私人啪啪vps| 日韩午夜视频在线观看| 99视频在线观看一区三区| 老司机免费视频久久| 久久综合狠狠综合久久激情| 国产美女精品| 午夜在线观看免费一区| 性欧美8khd高清极品| 国产精品国产三级国产aⅴ入口| 99re国产精品| 亚洲在线视频网站| 国产精品成人一区二区三区吃奶| 亚洲精品国产精品国自产在线| 最新高清无码专区| 欧美久久一级| 国产精品99久久久久久有的能看| 日韩手机在线导航| 欧美破处大片在线视频| 最新日韩精品| 亚洲视屏在线播放| 国产精品ⅴa在线观看h| 亚洲影院色无极综合| 欧美影院成年免费版| 国内精品国产成人| 久久三级视频| 亚洲三级影片| 午夜精品亚洲一区二区三区嫩草| 国产私拍一区| 久久亚洲国产成人| 91久久久久久久久| 亚洲夜间福利| 欧美一区二区视频在线观看| 免费在线亚洲| 99精品99| 国内精品免费在线观看| 欧美黄网免费在线观看| 一本一本久久a久久精品综合妖精| 亚洲欧美日韩高清| 在线播放日韩| 欧美日韩天天操| 欧美在线播放视频| 亚洲精品美女久久7777777| 午夜在线精品偷拍| 亚洲黄色免费| 国产精品一区二区在线观看网站| 久久美女性网| 亚洲专区在线视频| 欧美高清在线视频| 校园春色国产精品| 亚洲精品一区二区三区樱花| 国产精品久久久久av免费| 久久久在线视频| 亚洲性视频网址| 亚洲国产欧美在线人成| 欧美一区二区黄| 一本久久综合亚洲鲁鲁| 激情一区二区三区| 国产精品久久久久久久久久久久| 久久久精品一品道一区| 亚洲视频精品| 亚洲国产精品一区制服丝袜| 久久成人免费| 亚洲男人的天堂在线| 亚洲国产欧美另类丝袜| 国产一级一区二区| 国产精品日韩电影| 欧美日韩精品免费观看视频| 毛片av中文字幕一区二区| 香蕉久久夜色精品国产使用方法| 艳女tv在线观看国产一区| 亚洲国产精品高清久久久| 久久一区二区三区四区| 久久国产精品第一页| 亚洲一级黄色片| 亚洲色图制服丝袜| 亚洲精品一级| 亚洲人成欧美中文字幕| 亚洲国产精品久久久久婷婷老年| 国产日本欧美一区二区三区| 欧美性猛交xxxx免费看久久久| 欧美精品一区在线| 欧美精品激情| 欧美—级高清免费播放| 欧美激情麻豆| 欧美日韩精品免费在线观看视频| 欧美韩日高清| 欧美日韩国产成人在线免费| 欧美日韩高清在线| 欧美先锋影音| 国产乱码精品一区二区三区五月婷 | 国产嫩草一区二区三区在线观看| 欧美日本精品一区二区三区| 欧美女同视频| 欧美日韩一二三四五区| 国产精品成av人在线视午夜片| 欧美视频在线免费看| 国产精品xvideos88| 国产精品免费看| 国内成+人亚洲| 亚洲国产欧美一区二区三区久久| 亚洲国产一区二区精品专区| 亚洲人体影院| 国产精品视频免费一区| 国产色综合久久| 亚洲第一区在线| 99国产一区二区三精品乱码| 亚洲在线视频| 久久―日本道色综合久久| 欧美成人小视频| 99天天综合性| 欧美一区二区视频在线| 蜜桃av一区二区| 国产精品福利影院| 伊人精品久久久久7777| 亚洲清纯自拍| 亚洲在线观看免费| 久久久久欧美精品| 亚洲国产高清在线| 亚洲自拍偷拍视频| 免费在线亚洲| 欧美亚洲第一区| 在线观看亚洲| 亚洲在线中文字幕| 美日韩精品免费| 一区二区三区回区在观看免费视频| 亚洲欧美欧美一区二区三区| 久久久噜噜噜久久人人看| 欧美日韩国产美女| 影音先锋亚洲视频| 亚洲欧美成人精品| 欧美国产第二页| 亚洲女同在线| 欧美理论电影在线观看| 国内外成人免费激情在线视频网站| 亚洲精选在线观看| 久久久久久网站| 99在线热播精品免费99热| 久久久久久电影| 国产精品一二三四区| 亚洲麻豆av| 欧美激情精品久久久久久久变态| 亚洲伊人久久综合| 欧美日韩综合久久| 夜夜躁日日躁狠狠久久88av| 美女视频黄a大片欧美| 欧美一级成年大片在线观看| 欧美日韩在线三区| 亚洲美女视频在线观看|