【问题标题】:How should I wrap C libraries into C++我应该如何将 C 库包装到 C++ 中
【发布时间】:2014-03-24 10:32:00
【问题描述】:

典型的 C 库如下所示:

foo_t * foo_open();
int     foo_query( foo_t * );
int     foo_close( foo_t * );

我可以看到有两种方法可以将它们包装成简洁的 RAII 结构。我可以创建一个类并包装每个 C 函数:

class foo
{
public:
   foo(): m_impl( foo_open() ) { }
  ~foo() noexcept { foo_close( m_impl ); }
   int query() { return foo_query( m_impl ) };
};

或者我可以使用带有自定义析构函数的智能指针:

class foo_destructor
{ 
public:
    void operator()( foo_t * const obj ) noexcept
    {
        foo_close( obj ); 
    } 
};

typedef std::unique_ptr< foo_t, foo_destructor > foo_ptr;

直接使用C接口。

int main()
{
    foo_ptr my_foo( foo_open() );
    foo_query( my_foo.get() );
}

现在,我正在使用第二种解决方案,但主要是因为我懒得写所有的成员函数。有什么理由让一种方法真的比另一种更受欢迎吗?

【问题讨论】:

标签: c++ c raii


【解决方案1】:

第一种方法是更多的 C++ 做事方式。所有的功能都组合成一个逻辑单元(类),您已经封装了数据,以便 RAII 防止资源泄漏,并且您还设法删除了 foo_ 前缀!

【讨论】:

  • 此外,如果 C 库设计良好,它的界面不应该经常更改,因此编写包装器只是一次性工作。如果你不得不做很多这样的事情,你甚至可以自动化它,只需要做一些手动调整。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多