首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为面向对象的C++代码开发C包装器API

为面向对象的C++代码开发C包装器API
EN

Stack Overflow用户
提问于 2010-01-12 07:47:24
回答 4查看 49.4K关注 0票数 89

我正在寻求开发一组C API,它们将围绕我们现有的C++ API来访问我们的核心逻辑(用面向对象的C++编写)。这本质上是一个胶水API,它允许我们的C++逻辑被其他语言使用。有哪些好的教程、书籍或最佳实践介绍了在面向对象的C++中包装C所涉及的概念?

EN

回答 4

Stack Overflow用户

发布于 2010-01-12 12:05:29

我认为Michael Anderson的答案是正确的,但我的方法会有所不同。你必须担心一件额外的事情:异常。异常不是part的一部分,所以您不能让异常抛出C++代码之外。因此,您的标题将如下所示:

代码语言:javascript
复制
#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文件将如下所示:

代码语言:javascript
复制
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的空指针。改为这样做:

代码语言:javascript
复制
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提到的,链接可能会变得相当棘手。

希望这能有所帮助

票数 17
EN

Stack Overflow用户

发布于 2010-01-12 08:05:20

将C++代码暴露给C语言并不难,只需使用外观设计模式

我假设您的C++代码内置于一个库中,您所需要做的就是在您的C++库中创建一个C模块作为库的外观以及一个纯C头文件。C模块将调用相关的C++函数

一旦这样做了,您的C应用程序和库就可以完全访问您公开的C api。

例如,下面是一个示例门面模块

代码语言:javascript
复制
#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库自由使用,无需担心

代码语言:javascript
复制
// file name "libIntrface.h"
extern int doObjectOrientedStuff(int *, int, char*);

显然,这是一个人为的示例,但这是将C++库发布到C++的最简单方法

票数 10
EN

Stack Overflow用户

发布于 2010-01-12 08:05:01

只需将对象的概念替换为void * (在面向C的库中通常称为不透明类型),并重用您从C++中了解到的所有内容。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档