我正在寻找一套C API,它将围绕我们现有的C++ API来访问我们的核心逻辑(用面向对象C++编写).这将本质上是一个允许我们的C++逻辑可以被其他语言使用的gulp API.什么是一些好的教程、书籍或最佳实践,介绍围绕C语言C++封装C的概念?
我正在寻找一套C API,它将围绕我们现有的C++ API来访问我们的核心逻辑(用面向对象C++编写).这将本质上是一个允许我们的C++逻辑可以被其他语言使用的gulp API.什么是一些好的教程、书籍或最佳实践,介绍围绕C语言C++封装C的概念?
这不是很难手工完成,但将取决于您的界面的大小. 在我这样做的情况下,是为了在纯C代码中使用我们的C++库,因此SWIG没有太大帮助.(嗯,也许Sigg可以用来做这件事,但我不是Sigg大师,它看起来不是微不足道的)
我们最后做的就是:
这样的类(C++头)
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
将映射到如下C接口(C头):
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 );
接口的实现如下所示(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不支持类,我们必须将句柄设为 struct .
这就给了我们基本的C接口.如果您想要一个更完整的示例来说明集成异常处理的一种方式,那么您可以在GitHub:https://gist.github.com/mikeando/5394166上try 我的代码
有趣的部分是确保您可以将所有需要的C++库正确地链接到大的库中.对于gcc(或clang),这意味着只需使用g++完成最后的链接阶段.