一尘不染

具有C接口的C ++库

linux

我需要用c 编写一个库,客户端可以使用它在远程服务器上执行一些操作。我唯一还没有做的事情是:C
库需要一个C接口。让我更好地解释一下:从使用此lib的客户端中,我需要调用以下内容:int operation(void * addr); 如果int
<0错误,等等。但是该库是c 中的类。所以我的答案是..是否需要一个全局变量在库中保存类的实例?开发C 类的C接口有更好的选择吗?

谢谢建议。


阅读 273

收藏
2020-06-07

共1个答案

一尘不染

您可以在C包装程序中使用PIMPL习惯用法。您提供了一个YourClass_Create内部调用构造函数的方法(使用new),并返回指向您的类实例的指针;客户端代码,这将只是一个不透明的句柄(也可能是typedefvoid *),要传递给你的C接口的每个函数指定在其实例有工作(就像FILE *stdio)。

所有这些功能所要做的就是调用句柄上的相应方法(转换回指向您的类的指针)并将异常转换为错误代码。


正如 @ jdv-Jan de Vaan 在其评论中指出的那样,请不要忘记C包装代码周围的必要#ifdefed extern "C" {},否则您可能会遇到链接器错误。

2020-06-07