我正在寻求开发一组C API,它们将围绕我们现有的C++ API来访问我们的核心逻辑(用面向对象的C++编写)。这本质上是一个胶水API,它允许我们的C++逻辑被其他语言使用。有哪些好的教程、书籍或最佳实践介绍了在面向对象的C++中包装C所涉及的概念?
发布于 2010-01-12 12:05:29
我认为Michael Anderson的答案是正确的,但我的方法会有所不同。你必须担心一件额外的事情:异常。异常不是part的一部分,所以您不能让异常抛出C++代码之外。因此,您的标题将如下所示:
#ifdef __cplusplus
extern "C"
{
#endif
void * myStruct_create( const char * s );
void myStruct_destroy( void * v );
int myStruct_doSomething( void * v, int i );
#ifdef __cplusplus
}
#endif
包装器的.cpp文件将如下所示:
void * myStruct_create( const char * s ) {
MyStruct * ms = NULL;
try { /* The constructor for std::string may throw */
ms = new MyStruct(s);
} catch (...) {}
return static_cast<void*>( ms );
}
void myStruct_destroy( void * v ) {
MyStruct * ms = static_cast<MyStruct*>(v);
delete ms;
}
int myStruct_doSomething( void * v, int i ) {
MyStruct * ms = static_cast<MyStruct*>(v);
int ret_value = -1; /* Assuming that a negative value means error */
try {
ret_value = ms->doSomething(i);
} catch (...) {}
return ret_value;
}
更好的是:如果你知道你需要的只是一个单独的MyStruct实例,不要冒险去处理传递给你的API的空指针。改为这样做:
static MyStruct * _ms = NULL;
int myStruct_create( const char * s ) {
int ret_value = -1; /* error */
try { /* The constructor for std::string may throw */
_ms = new MyStruct(s);
ret_value = 0; /* success */
} catch (...) {}
return ret_value;
}
void myStruct_destroy() {
if (_ms != NULL) {
delete _ms;
}
}
int myStruct_doSomething( int i ) {
int ret_value = -1; /* Assuming that a negative value means error */
if (_ms != NULL) {
try {
ret_value = _ms->doSomething(i);
} catch (...) {}
}
return ret_value;
}
这个API要安全得多。
但是,正如Michael提到的,链接可能会变得相当棘手。
希望这能有所帮助
发布于 2010-01-12 08:05:20
将C++代码暴露给C语言并不难,只需使用外观设计模式
我假设您的C++代码内置于一个库中,您所需要做的就是在您的C++库中创建一个C模块作为库的外观以及一个纯C头文件。C模块将调用相关的C++函数
一旦这样做了,您的C应用程序和库就可以完全访问您公开的C api。
例如,下面是一个示例门面模块
#include <libInterface.h>
#include <objectedOrientedCppStuff.h>
int doObjectOrientedStuff(int *arg1, int arg2, char *arg3) {
Object obj = ObjectFactory->makeCppObj(arg3); // doing object oriented stuff here
obj->doStuff(arg2);
return obj->doMoreStuff(arg1);
}
然后,您可以将此C函数公开为您的API,并且可以将其作为C库自由使用,无需担心
// file name "libIntrface.h"
extern int doObjectOrientedStuff(int *, int, char*);
显然,这是一个人为的示例,但这是将C++库发布到C++的最简单方法
发布于 2010-01-12 08:05:01
只需将对象的概念替换为void *
(在面向C的库中通常称为不透明类型),并重用您从C++中了解到的所有内容。
https://stackoverflow.com/questions/2045774
复制相似问题