При подготовке библиотеки (назовем ее libfoo), я обнаружил, что мне представлена следующая дилемма: я пишу ее как библиотеку С++ с оберткой 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 с оберткой С++:
/* 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 как язык, поскольку я чувствую, что это меньшее семантическое минное поле. Что думают другие люди?
РЕДАКТИРОВАТЬ: так много хороших ответов. Спасибо всем. Это позор, что я могу только принять его.