Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2119003
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-08-21 09:05:20


    昨天在看了篇关于C++中如何调用C,通过那篇文章,对于extern "C"有了比较深的理解。所以,突然想到怎么样在C中调用C++中?还是用extern "C"吗?或者是其他方法?
    所以,从网上查找资料,找到一篇文章,在这里先感谢作者。另外,如果各位看到这篇文章哪里有什么问题,请指教,因为,我对于C中调用C++确实没有一点概念,这篇文章算是关于这方面知识的起步了。

    正文如下。
    将C++函数声明为extern "C"(在你的C++代码中做这个声明),然后调用它(在你的C或C++中代码里调用)。例如:
  1. // C++ code:
  2. extern "C" void f(int);
  3. void f(int i)
  4. {
  5.      // ...
    然后,你可以这样使用f():
  1. /* C code: */
  2. void f(int);
  3. void cc(int i)
  4. {
  5.     f(i);
  6.    /* ... */
  7. }
    当然,这种方法只适用于非成员函数。如果你想要在C里面调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:
  1. // C++ code:
  2. class C
  3. {
  4.        // ...
  5.        virtual double f(int);
  6. };
  7.  
  8. extern "C" double call_C_f(C* p, int i) // wrapper function
  9. {
  10.        return p->f(i);
  11. }
    当然,你就可以这样调用C::f:
  1. /* C code: */
  2. double call_C_f(struct C* p, int i);
  3.  
  4. void ccc(struct C* p, int i)
  5. {
  6.        double d = call_C_f(p,i);
  7.        /* ... */
  8. }
    如果你想在C里面调用重载函数,则必须提供不同名字的包装,这样才能在C代码里面调用。例如:
  1. // C++ code:
  2. void f(int);
  3. void f(double);
  4.  
  5. extern "C" void f_i(int i) { f(i); }
  6. extern "C" void f_d(double d) { f(d); }
    然后,你可以这样使用每个重载的f():
  1. /* C code: */
  2. void f_i(int);
  3. void f_d(double);
  4.  
  5. void cccc(int i,double d)
  6. {
  7.        f_i(i);
  8.        f_d(d);
  9.        /* ... */
  10. }
    注意:这些技巧也适用于在C调用C++类库,即使你不能(或者不想)修改C++头文件。
    
    该翻译文档Bjarne Stroustrup的原文链接地址是:
    作者的Demo为:cCallCppDemo.rar
    

    原文:http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html









































阅读(1115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~