为库创建 C 包装器C++

creating a c wrapper for C++ library

本文关键字:C++ 包装 创建      更新时间:2023-10-16

通过不透明的指针将c ++库包装为C是否提供了稳定的ABI接口?我很清楚 ABI 接口以及为什么 c++ 没有稳定的接口。这与名称重整和许多其他东西有关。我知道C在那个部分非常稳定。与C++相比,将 C 库包装成各种其他语言也很容易。这两个是为我的库制作 c API 的驱动力。

将C++库包装为 C 时,底层代码仍C++。我的情况是带有提升共享 ptr 和其他依赖项的 c++。

那么

既然底层代码C++,那么ABI稳定性是如何实现的。或者换句话说,共享库中仍然编译了 c++ 的东西(.so、.dll 等)。

我想知道它是如何工作的。也许有人可以为我提供一个例子,很好地解释这些东西。

是的,你可以为C++实现创建一个稳定的C-Inteface。 当然,C 接口仅提供 C 功能。 使用C++进行实际实现仍然很方便。 下面是一个示例,其中您有一个带有函数模板的 C++ 实现,并且您为某些变体提供了 C 接口:

// Internal C++ implementation
template <typename T>
void
foo(T &a, const T &b)
{
    // do something
}

// C Interface
extern "C" {
void
sfoo(float *a, const float *b)
{
    foo(*a, *b);
}
void
dfoo(double *a, const double *b)
{
    foo(*a, *b);
}
} // extern "C"

所以基本上编译器会为T=floatT=double生成不同的实现:

  • 当然,您没有函数重载。 所以你必须把名字做得手忙脚乱。 例如 sfoo为浮动,dfoo为双倍,...(您也可以使用 C 语言中的预处理器执行此操作。但是阅读和维护它并不是那么好。
  • 您没有引用。 因此,接口不是引用,而是公开非常量指针。

是的,它将是适用于您平台的C编译器的稳定C ABI;当然,如果做得好。