• <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>
            franksunny的個人技術(shù)空間
            獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

             

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

             

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

             

            C++ 函數(shù)聲明為``extern "C"''(在你的 C++ 代碼里做這個聲明),然后調(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);

               /* ... */

                }

             

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

             

            然后,你可以這樣使用每個重載的 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++ 類庫,即使你不能(或者不想)修改 C++ 頭文件。

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

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

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

             

             

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

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

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

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

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

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

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

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

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

            沒看明白你的意思,沒有設(shè)置類的實例對象,自然是NULL的啊,你想它的值是多少啊?
            而且本實現(xiàn)call_C_f_i和call_C_f_d只是一個接口函數(shù)  回復(fù)  更多評論
              
            # re: C中如何調(diào)用C++函數(shù)[未登錄]
            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ù)  更多評論
              
            # re: C中如何調(diào)用C++函數(shù)[未登錄]
            2008-12-12 12:39 | leon
            試了下可以了,把extern "C"改成extern就行了  回復(fù)  更多評論
              
            # re: C中如何調(diào)用C++函數(shù)[未登錄]
            2011-09-07 14:28 | 靈魂
            非常感謝您詳細的講解。
            可是在您的例子里,main函數(shù)還是在cpp文件出現(xiàn)的,要是改成C文件就編譯不過去了。會顯示class這里編譯不過去。  回復(fù)  更多評論
              
            # re: C中如何調(diào)用C++函數(shù)
            2012-01-06 12:29 | sssw
            如此用C調(diào)用C++函數(shù)的意義何在?失去了面向?qū)ο蟮幕咎卣鳎皇前褌€C++函數(shù)當C函數(shù)用而已。  回復(fù)  更多評論
              

            常用鏈接

            留言簿(13)

            隨筆分類

            個人其它博客

            基礎(chǔ)知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            久久99热这里只频精品6| 91精品国产综合久久香蕉| 久久精品一区二区影院| 国产精品久久国产精品99盘| 日韩精品久久久久久免费| 久久婷婷成人综合色综合| 99久久精品日本一区二区免费| 一本一本久久aa综合精品| 性欧美丰满熟妇XXXX性久久久| 欧美国产成人久久精品| 人妻久久久一区二区三区| 97精品国产91久久久久久| 色偷偷888欧美精品久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久国产影院| 亚洲精品高清一二区久久| 综合网日日天干夜夜久久| 久久久无码精品亚洲日韩按摩 | 久久精品免费观看| 久久精品国产只有精品66| 亚洲欧美国产精品专区久久| 久久人做人爽一区二区三区| 久久精品亚洲中文字幕无码麻豆| 国产91久久精品一区二区| 久久国产福利免费| 精品熟女少妇AV免费久久 | 久久免费视频观看| 一97日本道伊人久久综合影院| 久久久久久精品久久久久| 天天久久狠狠色综合| 伊人色综合久久天天人守人婷| 久久精品中文騷妇女内射| 青青热久久国产久精品 | 欧美亚洲色综久久精品国产| 午夜不卡888久久| 亚洲狠狠婷婷综合久久久久| 一本久久久久久久| 久久大香香蕉国产| 久久精品国产亚洲αv忘忧草| 91久久成人免费| 91精品国产高清久久久久久io|