gpt4 book ai didi

c++ - 用 c 包装一个 c++ 库? (不要 "extern c")

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:32 28 4
gpt4 key购买 nike

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

我该怎么做?

有现成的工具吗?

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

最佳答案

您可以用 C 编写面向对象的代码,因此如果它是面向对象的 C++ 库,则可以将其包装在 C 接口(interface)中。然而,这样做可能会非常乏味,尤其是当您需要支持继承、虚函数和诸如此类的东西时。

如果 C++ 库采用通用编程(模板),它可能会变得非常棘手(您需要提供所有需要的模板实例)并很快接近不值得这样做的地步。

假设它是 OO,下面是如何在 C 中实现 OO 的基本草图:

C++ 类:

class cpp {
public:
cpp(int i);
void f();
};

C 接口(interface):

#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

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

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

关于c++ - 用 c 包装一个 c++ 库? (不要 "extern c"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047255/

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