我需要用c ++编写一个库,客户端可以在远程服务器上执行某些操作。特定的唯一一件事我还没有完成:c ++库需要一个C接口。让我解释一下: 从使用此lib的客户端我需要调用类似于: int operation(void * addr); 如果int <0错误 所以.. 但是这个库是c ++中的一个类。 所以我的答案是..需要一个包含库中类实例的全局变量吗? 开发C ++类的C接口是一些更好的选择吗?
感谢您的建议。
我需要用c ++编写一个库,客户端可以在远程服务器上执行某些操作。特定的唯一一件事我还没有完成:c ++库需要一个C接口。让我解释一下: 从使用此lib的客户端我需要调用类似于: int operation(void * addr); 如果int <0错误 所以.. 但是这个库是c ++中的一个类。 所以我的答案是..需要一个包含库中类实例的全局变量吗? 开发C ++类的C接口是一些更好的选择吗?
感谢您的建议。
你可以使用 PIMPL习语 在C包装器中。你提供了一种方法 YourClass_Create
在内部调用构造函数(使用 new
)并返回指向类实例的指针;对于客户端代码,这将只是一个不透明的句柄(它可能是一个 typedef
对于 void *
),传递给C接口的每个函数,以指定它必须工作的实例(就像 FILE *
在 stdio
)。
所有这些函数必须做的是调用句柄上的相应方法(转换回指向您的类的指针)并将异常转换为错误代码。
如 @ jdv-Jan de Vaan 在他的评论中指出,不要忘记必要的 #ifdef
ED extern "C" {}
围绕C包装器代码,否则可能会出现链接器错误。