C++库与C接口

11

我需要在C++中编写一个库,可供客户端使用以在远程服务器上执行某些操作。特别的是,我还没有完成的一件事是:这个C++库需要一个C接口。让我更好地解释一下:

从客户端使用这个库时,我需要调用类似以下的内容:

int operation(void* addr);

如果 int<0 则为错误,以此类推。

但是该库是一个C++中的类。那么我的回答是,我需要一个全局变量来保存库中类的实例吗?还有其他更好的选项来开发C++类的C接口吗?

感谢您的答复。


4
关键答案已经在下面了。不要忘记在你的接口声明中加上 extern "C" {} - user180326
2
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html - Flexo
1
一个现实生活中的例子是0MQ库,网址为http://www.zeromq.org:它是用C++编写的,具有C接口(并且在其周围包装了一个C++接口)。 - Fred Foo
1个回答

17
你可以在C封装器中使用PIMPL机制。你提供了一个方法YourClass_Create,它内部调用构造函数(使用new),并返回指向你的类实例的指针;对于客户端代码,这将只是一个不透明的句柄(它可以是void *typedef),需要传递给你的C接口的每个函数,以指定它必须处理的实例(就像在stdio中的FILE *一样)。
所有这些函数所要做的就是在句柄上调用相应的方法(转换回指向你的类的指针),并将异常转换为错误代码。
@jdv-Jan de Vaan在评论中指出,不要忘记在您的C包装器代码周围添加必要的#ifdefextern "C" {},否则可能会出现链接器错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接