gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:28 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

// 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 表示 float,dfoo 表示 double,...(您也可以使用 C 中的预处理器来执行此操作。但阅读和维护起来并不是那么好。 )
  • 您没有引用资料。因此,接口(interface)公开了非常量指针而不是引用。

关于c++ - 为 C++ 库创建一个 c 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35623559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com