C如何调用C++的库

前段时间遇到了一个C调用C++的接口的问题,现在把思路整理一下。
提供给我们的是C++头文件(.h)和静态库(.a)
C不可以直接调用C++,我们采用C++调用C++的方法,另外建一个适配层
在我们的C++适配层中加上extern "C"
C调用C++适配层,适配层调用C++就OK了。

下面用一个例子来说明一下:
1、模拟条件one.h,libone.a
  one.h
  
  #ifndef __ONE_H__
  #define __ONE_H__
  
  void print();
  
  #endif
  
  /
  
  one.cpp
  
  #include<stdio.h>
  #include "one.h"
  
  void print(void)
  {
     printf("Hello world!/n");
  }
  
  生成one.a
  g++ -c one.cpp
  ar -rcs libone.a one.o
  one.cpp  ----->  libone.a

2、要调用C++的C函数
  three.c
  
  #include "one.h"
  int main()
  {
   print();
   return 0;
  }
  
  这样调用肯定是不成功的,和我之前遇到的问题是一样的了
  请看下面的解决方法:

3、C++适配层

  two.h
  #ifndef __TWO_H__
  #define __TWO_H__
  
  
  #ifdef __cplusplus
  extern "C"
  {
  #endif
  
    void print2();
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif
  
  /
  
  two.cpp
  
  #include "one.h"
  #include "two.h"
  
  extern "C"
  {
    void print2()
    {
      print();
    }
  }
  
  编译成库
  g++ -c two.cpp
  ar -rcs libtwo.a two.o
  two.cpp  ----->  libtwo.a

4、现在直接在three.c中调用two中的print2()就可以达到目的了。

5、需要特别说明的是,这个只是最简单的C++的一个函数,如果这个函数是在类中该怎么办呢?
   我们还是本着上面的思想,把C不能识别代码转化为C可以调用的:
  
    假设Classname类中有个成员函数
    function_in_class(char str);
    这回我们的适配层就要多点东西了
   头文件中:typedef void *VClassname ;
   源文件中:
  static VClassname Classname_create_1()
  {
   return reinterpret_cast<VClassname> (new Classname());
  }
  static void function_in_class_c_1(VClassname thiz,char strt)
  {
   Classname *ins=(Classname *)(thiz);
      ins->function_in_class(str);
  }
  extern "C"
  {
     VClassname Classname_create()
     {
        return static_cast<VClassname>(Classname_create_1());
     }
     void function_in_class_c(VClassname thiz,char str)
     {
        function_in_class_c_1(thiz,str);
     }
  }

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值