为库创建 C 包装器C++
creating a c wrapper for C++ library
通过不透明的指针将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=float
和T=double
生成不同的实现:
- 当然,您没有函数重载。 所以你必须把名字做得手忙脚乱。 例如
sfoo
为浮动,dfoo
为双倍,...(您也可以使用 C 语言中的预处理器执行此操作。但是阅读和维护它并不是那么好。 - 您没有引用。 因此,接口不是引用,而是公开非常量指针。
是的,它将是适用于您平台的C编译器的稳定C ABI;当然,如果做得好。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法