ライブラリ (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 がより小さな意味論的地雷原であると感じているため、C を好みます。他の人はどう思いますか?
編集:非常に多くの良い答え。皆さんありがとう。1つしか受け入れられないのは残念です。