为C ++库创建一个c包装器

时间:2016-02-25 09:43:50

标签: c++ c api abi

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

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

因为底层代码是在C ++中,所以如何实现ABI稳定性。或者换句话说,仍然在共享库中编译c ++东西(.so,.dll等...)

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

2 个答案:

答案 0 :(得分:4)

是的,您可以为C ++实现创建稳定的C-Inteface。当然,C-Interface仅提供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中的预处理器执行此操作。但读取和维护并不是那么好。)
  • 您没有参考资料。因此,接口不是引用,而是公开非常量指针。

答案 1 :(得分:1)

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