Написание библиотеки с интерфейсами C и C ++, в какой способ обернуть?

При подготовке библиотеки (назовем ее libfoo) я сталкиваюсь со следующей дилеммой: писать ли ее как библиотеку C ++ с оболочкой C:

namespace Foo {
  class Bar {
    ...
  };
}

/* Separate C header. #ifdef __cplusplus omitted for brevity. */
extern "C" {
  typedef void *FooBar;
  FooBar* foo_bar_new() { return new Foo::Bar; }
  void foo_bar_delete(FooBar *bar) { delete bar; }
}

Или лучше напишите его как библиотеку C с оболочкой C ++:

/* foo/bar.h. Again, #ifdef __cplusplus stuff omitted. */

typedef struct {
  /* ... */
} FooBar;

void foo_bar_init(FooBar *self) { /* ... */ }
void foo_bar_deinit(FooBar *self) { /* ... */ }

/* foo/bar.hpp */

namespace Foo {
  class Bar {
    /* ... */
    FooBar self;
  }

  Bar::Bar() {
    foo_bar_init(&self);
  }

  Bar::~Bar() {
    foo_bar_deinit(&self);
  }
}

Что вы предпочитаете и почему? Я предпочитаю последнее, потому что это означает, что мне не нужно беспокоиться о том, что в моих функциях C случайно появятся исключения, плюс я предпочитаю C как язык, поскольку я чувствую, что это меньшее семантическое минное поле. Что думают другие?

РЕДАКТИРОВАТЬ: Так много хороших ответов. Спасибо всем. Жалко, что я могу принять только один.

14
задан Jack Kelly 12 October 2010 в 12:10
поделиться