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://www.cppblog.com/Files/franksunny/cCallCppDemo.rar

 

 

posted on 2007-11-29 20:38 frank.sunny 阅读(53346) 评论(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://www.cppblog.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函数用而已。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜