明白在C中如何使用C++

1160阅读 0评论2013-08-21 梦醒潇湘love
分类:C/C++


    昨天在看了篇关于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









































上一篇:明白在C++中如何使用C
下一篇:第十二章——Linux系统调用