gpt4 book ai didi

c++ - 为面向对象的 C++ 代码开发 C 包装 API

转载 作者:行者123 更新时间:2023-11-30 16:16:35 24 4
gpt4 key购买 nike

我正在寻求开发一组 C API,它们将围绕我们现有的 C++ API 来访问我们的核心逻辑(用面向对象的 C++ 编写)。这本质上是一个粘合 API,允许其他语言使用我们的 C++ 逻辑。有哪些好的教程、书籍或最佳实践介绍了将 C 封装到面向对象的 C++ 中所涉及的概念?

最佳答案

这对于手动完成来说并不太难,但取决于界面的大小。我所做的例子是在纯 C 代码中使用我们的 C++ 库,因此 SWIG 没有太大帮助。 (好吧,也许 SWIG 可以用来做到这一点,但我不是 SWIG 专家,这看起来并不简单)

我们最终所做的是:

  1. 在 C 中,每个对象都会传递一个不透明的句柄。
  2. 构造函数和析构函数封装在纯函数中
  3. 成员函数是纯函数。
  4. 其他内置函数尽可能映射到 C 等效项。

像这样的类(C++ 头文件)

class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}

将映射到这样的 C 接口(interface)(C header ):

struct HMyClass; // An opaque type that we'll use as a handle
typedef struct HMyClass HMyClass;
HMyClass * myStruct_create( const char * s );
void myStruct_destroy( HMyClass * v );
int myStruct_doSomething( HMyClass * v, int i );

接口(interface)的实现如下所示(C++ 源代码)

#include "MyClass.h"

extern "C"
{
HMyClass * myStruct_create( const char * s )
{
return reinterpret_cast<HMyClass*>( new MyClass( s ) );
}
void myStruct_destroy( HMyClass * v )
{
delete reinterpret_cast<MyClass*>(v);
}
int myStruct_doSomething( HMyClass * v, int i )
{
return reinterpret_cast<MyClass*>(v)->doSomething(i);
}
}

我们从原始类派生不透明句柄,以避免需要任何转换,并且(这似乎不适用于我当前的编译器)。我们必须将句柄设为结构体,因为 C 不支持类。

这样我们就得到了基本的 C 接口(interface)。如果您想要一个更完整的示例来展示一种集成异常处理的方法,那么您可以在 github 上尝试我的代码:https://gist.github.com/mikeando/5394166

现在有趣的部分是确保您将所有必需的 C++ 库正确链接到更大的库中。对于 gcc(或 clang),这意味着只需使用 g++ 进行最后的链接阶段。

关于c++ - 为面向对象的 C++ 代码开发 C 包装 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534400/

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