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

franksunny的個人技術空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

 

C中如何調用C++函數?

 

前陣子被問及一個在C中如何調用C++函數的問題,當時簡單回答是將函數extern "C"聲明,當被問及如何將類內成員函數聲明時,一時語塞,后來網上查了下,網上有一翻譯C++之父的文章可以作為解答,遂拿來Mark一下。

 

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

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

 

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

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

    }

 

當然,這招只適用于非成員函數。如果你想要在 C 里調用成員函數(包括虛函數),則需要提供一個簡單的包裝(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);

}

 

然后,你就可以這樣調用 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 里調用重載函數,則必須提供不同名字的包裝,這樣才能被 C 代碼調用。例如

// 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); }

 

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

/* C code: */

void f_i(int);

void f_d(double);

 

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

       /* ... */

}

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

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

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

本來貼出來以后受到很多C/C++朋友的關注,非常榮幸,在“夢在天涯”的提醒下,本人后來又完成了一個Demo工程,發現和BJ說的有點出入,希望有高手指點,Demo工程下載鏈接如下:http://m.shnenglu.com/Files/franksunny/cCallCppDemo.rar

 

 

posted on 2007-11-29 20:38 frank.sunny 閱讀(60748) 評論(21)  編輯 收藏 引用 所屬分類: C/C++學習和實踐

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

前些天C++群里有人問,好像大家都不會哦!

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

同時感謝大家的關注,希望對實例工程提出更多想法。  回復  更多評論
  
# re: C中如何調用C++函數[未登錄]
2007-12-01 14:58 | lymons
這種方法 得修改要調用函數的C++的源代碼文件,在里面添加一個給C的接口函數才可以。

但是在大多數的C開發里,我們往往是看不到要調用的C++的代碼,
或者說對方只給你提供C++的庫的二進制代碼的時候,這個時候該怎么辦呢?
  回復  更多評論
  
# re: C中如何調用C++函數
2007-12-03 09:21 | 夢在天涯
frank,有實例,哦,那里哦,可以把地址發這里哦

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

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

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

沒看明白你的意思,沒有設置類的實例對象,自然是NULL的啊,你想它的值是多少?。?
而且本實現call_C_f_i和call_C_f_d只是一個接口函數  回復  更多評論
  
# re: C中如何調用C++函數[未登錄]
2008-12-12 12:33 | leon
在demo代碼里為什么用cCallCppDemo.cpp,我用cCallCppDemo.c編譯失敗,在設置里c/c++設置為不使用預編譯頭也是失敗,提示warning C4013: 'call_C_f_i' undefined; assuming extern returning int  回復  更多評論
  
# re: C中如何調用C++函數[未登錄]
2008-12-12 12:39 | leon
試了下可以了,把extern "C"改成extern就行了  回復  更多評論
  
# re: C中如何調用C++函數[未登錄]
2011-09-07 14:28 | 靈魂
非常感謝您詳細的講解。
可是在您的例子里,main函數還是在cpp文件出現的,要是改成C文件就編譯不過去了。會顯示class這里編譯不過去。  回復  更多評論
  
# re: C中如何調用C++函數
2012-01-06 12:29 | sssw
如此用C調用C++函數的意義何在?失去了面向對象的基本特征,只是把個C++函數當C函數用而已。  回復  更多評論
  

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩视频在线观看一区二区| 亚洲午夜影视影院在线观看| 麻豆成人91精品二区三区| 国产精品99久久99久久久二8| 亚洲国产导航| 欧美二区视频| 亚洲国产一区二区三区高清| 欧美成人一区二区在线 | 欧美激情中文字幕一区二区 | 欧美精品福利在线| 欧美国产欧美综合 | 欧美黄色影院| 91久久中文| 亚洲一区二区三区视频播放| 香蕉成人伊视频在线观看| 久久久亚洲成人| 亚洲美洲欧洲综合国产一区| 亚洲中午字幕| 久热综合在线亚洲精品| 欧美国产视频日韩| 国产乱子伦一区二区三区国色天香| 国产美女一区| 亚洲精选视频免费看| 亚洲欧美视频在线| 免费亚洲婷婷| 一本在线高清不卡dvd| 久久激情中文| 国产精品嫩草久久久久| 亚洲国产岛国毛片在线| 亚洲色图制服丝袜| 另类图片综合电影| 在线中文字幕日韩| 美女视频黄 久久| 国产精品揄拍一区二区| 夜夜嗨av一区二区三区网页 | 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲精品影院在线观看| 亚洲欧美日韩一区二区三区在线| 欧美成人免费视频| 亚洲一区二区三区在线看 | 玖玖玖国产精品| 亚洲一本视频| 欧美激情综合色综合啪啪| 黄色亚洲精品| 久久久国产91| 亚洲欧美日韩国产成人| 欧美日韩高清在线播放| 亚洲成人在线免费| 久久女同互慰一区二区三区| 亚洲伊人网站| 国产精品国产一区二区| 亚洲乱码一区二区| 欧美国产激情| 能在线观看的日韩av| 在线观看成人av| 蜜臀91精品一区二区三区| 欧美午夜精品一区二区三区| 国产精品红桃| 99精品视频免费观看视频| 欧美成人精品一区| 久久国产精品99国产精| 国产精品国产三级国产a| 99精品国产99久久久久久福利| 久久中文久久字幕| 欧美在线播放视频| 国产色婷婷国产综合在线理论片a| 亚洲欧美国产另类| 中文欧美在线视频| 国产精品香蕉在线观看| 欧美在线精品免播放器视频| 亚洲一区亚洲| 国产日本欧美在线观看| 久久久久国产精品一区三寸| 久久aⅴ国产欧美74aaa| 韩国视频理论视频久久| 欧美不卡激情三级在线观看| 美女主播精品视频一二三四| 艳妇臀荡乳欲伦亚洲一区| 香蕉久久一区二区不卡无毒影院| 亚洲一区中文| 在线观看一区二区视频| 亚洲大胆视频| 欧美色网一区二区| 久久国产精品毛片| 麻豆精品91| 亚洲婷婷国产精品电影人久久 | 久久久精品视频成人| 亚洲国产mv| 一本大道久久精品懂色aⅴ| 国产乱码精品一区二区三区忘忧草| 久久午夜羞羞影院免费观看| 欧美阿v一级看视频| 亚洲伊人色欲综合网| 久久久久久久一区二区三区| 9久re热视频在线精品| 欧美一区二区福利在线| 最新国产成人在线观看| 亚洲午夜av在线| 在线观看视频一区二区欧美日韩| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧美高清| 亚洲精品免费电影| 亚洲欧美激情四射在线日 | 久久免费国产| 午夜免费电影一区在线观看| 女仆av观看一区| 久久成人免费视频| 欧美激情va永久在线播放| 久久激情一区| 欧美日韩在线电影| 亚洲福利免费| 亚洲欧美日韩成人高清在线一区| 免播放器亚洲| 久久精品国产v日韩v亚洲 | 国内成人精品2018免费看| 亚洲免费成人av| 亚洲国产一区二区三区青草影视| 亚洲欧美卡通另类91av| 一本一本久久| 女仆av观看一区| 麻豆精品传媒视频| 国产日韩成人精品| 99综合在线| 亚洲一区激情| 国产精品白丝jk黑袜喷水| 亚洲精品国产精品国产自| 亚洲国产精品女人久久久| 久久精品国产亚洲一区二区三区| 久久国产手机看片| 国产欧美亚洲视频| 亚洲女人小视频在线观看| 中文国产一区| 欧美午夜精品久久久久久久 | 亚洲精选国产| 欧美成人午夜激情| 欧美插天视频在线播放| 在线观看精品视频| 蜜桃久久av一区| 欧美1区3d| 亚洲精品综合精品自拍| 欧美日韩国产限制| 99在线|亚洲一区二区| 亚洲午夜精品一区二区三区他趣 | 在线观看亚洲精品视频| 久久亚洲精选| 亚洲高清在线观看| 日韩性生活视频| 欧美喷水视频| 亚洲性视频h| 久久精品国产91精品亚洲| 国产亚洲视频在线| 久久精品人人做人人爽| 欧美激情在线| 在线综合亚洲欧美在线视频| 欧美日韩国产精品成人| 亚洲在线视频免费观看| 久久免费黄色| 99成人在线| 国产精品有限公司| 久久久久一区二区三区| 亚洲精品欧美日韩专区| 亚洲欧美日本另类| 在线日韩成人| 欧美日韩一区二区三区视频| 亚洲欧美在线网| 亚洲国产精品精华液网站| 亚洲一级在线观看| 国产视频亚洲精品| 欧美电影免费观看高清完整版| 一区二区三区色| 另类天堂视频在线观看| 99精品久久久| 激情文学综合丁香| 欧美日韩国内自拍| 亚洲乱亚洲高清| 国产精品亚洲成人| 久久综合九色综合欧美就去吻| 日韩一级大片| 亚洲第一视频| 久久成人免费| 中日韩视频在线观看| 精品二区视频| 欧美日韩一区二区在线视频 | 亚洲黄色片网站| 欧美午夜欧美| 免费日韩成人| 欧美亚洲视频在线观看| 亚洲精品美女久久7777777| 久久国产视频网站| 宅男噜噜噜66一区二区 | 亚洲经典在线看| 国产亚洲视频在线| 欧美婷婷六月丁香综合色| 久热精品在线| 久久精品色图| 欧美亚洲一区在线| 亚洲自拍偷拍网址| 在线亚洲欧美视频| 夜夜嗨av一区二区三区网页| 亚洲精品视频一区|