为C库编写C++包装器

str*_*pes 9 c c++ wrapper

我有一个遗留的C库,以OO类型的形式编写.典型的功能如下:

LIB *lib_new();
void lib_free(LIB *lib);
int lib_add_option(LIB *lib, int flags);
void lib_change_name(LIB *lib, char *name);
Run Code Online (Sandbox Code Playgroud)

我想在我的C++程序中使用这个库,所以我认为需要一个C++包装器.以上所有似乎都会映射到:

class LIB
{
    public:
         LIB();
         ~LIB();
         int add_option(int flags);
         void change_name(char *name);
...
};
Run Code Online (Sandbox Code Playgroud)

我以前从来没有写过C++的C++包装器,也找不到很多关于它的建议.这是创建C++/C包装器的好/典型/明智的方法吗?

小智 7

不需要C++包装器 - 您只需从C++代码中调用C函数即可.恕我直言,最好不要包装C代码 - 如果你想把它变成C++代码 - 很好,但要做一个完整的重写.

实际上,假设您的C函数在名为myfuncs.h的文件中声明,那么在您的C++代码中,您将希望包含它们,如下所示:

extern "C" {
   #include "myfuncs.h"
}
Run Code Online (Sandbox Code Playgroud)

为了在用C++编译器编译时给它们C链接.

  • 我不同意(但没有downvote).对于简单的C库,通常不需要包装器.但是,对于更复杂的C库,轻量级C包装器可能是非常宝贵的.一个例子让人想起:Tibco在Tibrv周围有一个非常轻巧的包装,非常有用. (7认同)

Tro*_*nic 5

我通常只编写一个简单的RAII包装器而不是包装每个成员函数:

class Database: boost::noncopyable {
  public:
    Database(): handle(db_construct()) {
        if (!handle) throw std::runtime_error("...");
    }
    ~Database() { db_destruct(handle); }
    operator db_t*() { return handle; }
  private:
    db_t* handle;
};
Run Code Online (Sandbox Code Playgroud)

使用类型转换运算符,它可以与C函数一起使用:

Database db;
db_access(db, ...);  // Calling a C function with db's type conversion operator
Run Code Online (Sandbox Code Playgroud)