在c中包装一个c ++库?(不要"extern c")

dev*_*vel 5 c c++

是否可以将c ++库包装到c中?

我怎么能这样做?

有没有现有的工具?

(需要访问现有的c ++库,但只能访问C)

sbi*_*sbi 13

您可以在C中编写面向对象的代码,因此如果它是面向对象的C++库,则可以将其包装在C接口中.但是,这样做可能非常繁琐,特别是如果您需要支持继承,虚函数等等.

如果C++库使用通用编程(模板),它可能会变得非常毛茸茸(你需要提供所有需要的模板实例)并快速接近它不值得这样做的地步.

假设它是OO,这是一个如何在C中执行OO的基本草图:

C++类:

class cpp {
  public:
    cpp(int i);
    void f();
};
Run Code Online (Sandbox Code Playgroud)

C界面:

#ifdef __cplusplus
extern "C" {
#endif
  typedef void* c_handle;

  c_handle c_create(int i)
  {
    return new cpp(i);
  }

  void c_f(c_handle hdl)
  {
    static_cast<cpp*>(hdl)->f();
  }

  void c_destroy(c_handle hdl)
  {
    delete static_cast<cpp*>(hdl);
  }
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您可以修改它.例如,如果这将成为私有C++ API的公共C接口,则将实际指针作为句柄分发可能会使其易受攻击.在这种情况下,您将分发基本上是整数的句柄,将指针存储在句柄到指针映射中,并通过查找替换强制转换.

具有返回字符串和其他动态大小的资源的函数也可以变得非常精细.你需要C调用者提供缓冲区,但它不能事先知道大小.然后,某些API(如WIn32 API的一部分)允许调用者使用长度为0的缓冲区调用此类函数,在这种情况下,它们返回所需缓冲区的长度.但是,这样做可能会使API调用效率极低.(如果你只知道算法执行后所需缓冲区的长度,则需要执行两次.)
我过去做过的一件事就是将句柄(类似于上面代码中的句柄)分发给内部存储字符串并提供API以询问所需的缓冲区大小,检索提供缓冲区的字符串,并销毁句柄(删除内部存储的字符串).
这是一个真正的PITA使用,但这是C.