问题 带c接口的c ++库


我需要用c ++编写一个库,客户端可以在远程服务器上执行某些操作。特定的唯一一件事我还没有完成:c ++库需要一个C接口。让我解释一下: 从使用此lib的客户端我需要调用类似于: int operation(void * addr); 如果int <0错误 所以.. 但是这个库是c ++中的一个类。 所以我的答案是..需要一个包含库中类实例的全局变量吗? 开发C ++类的C接口是一些更好的选择吗?

感谢您的建议。


12895
2018-02-12 13:35


起源

关键的答案已经是下滑。别忘了 extern "C" {} 你的界面声明。
parashift.com/c++-faq-lite/mixing-c-and-cpp.html - Flexo♦
有关实际示例,请查看0MQ库, zeromq.org:用C语言编写的C接口(以及一个C ++接口)。 - Fred Foo


答案:


你可以使用 PIMPL习语 在C包装器中。你提供了一种方法 YourClass_Create 在内部调用构造函数(使用 new)并返回指向类实例的指针;对于客户端代码,这将只是一个不透明的句柄(它可能是一个 typedef 对于 void *),传递给C接口的每个函数,以指定它必须工作的实例(就像 FILE * 在 stdio)。

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


@ jdv-Jan de Vaan 在他的评论中指出,不要忘记必要的 #ifdefED extern "C" {} 围绕C包装器代码,否则可能会出现链接器错误。


16
2018-02-12 13:42