C API は多くの場合、不透明なハンドルを提供します。これにより、コンシューマーはそれらが何であるかを尋ねたり、内部を突こうとしたりすることを思いとどまらせます。これらのハンドルがポインターであるという事実は重要ではなく、消費者にとって重要ではありません。
たとえば、ハンドルを定義して C++ バインディングを記述することは完全に可能です。
typedef void * MyHandle;
ここで、至福の C コンシューマーにいくつかの関数を与えます。
MyHandle create_gizmo();
void destroy_gizmo(MyHandle);
int do_magic(MyHandle, int, int);
そのような単純な。ユーザーはすぐにそれを使用する方法を確認します。
#include "MagicAPI.h"
MyHandle h = create_gizmo();
submit_result(do_magic(h, 12, 91));
destroy_gizmo(h);
そして、C++ ライブラリの開発者は、ハンドルをアンラップし、API 関数を設定するだけです (もちろん、宣言されていますextern "C"
)。
#include "MagicAPI.h"
#include "SuperGizmo.hpp"
MyHandle create_gizmo() { return static_cast<MyHandle>(new SuperGizmo); }
void destroy_gizmo(MyHandle h) { delete static_cast<SuperGizmo *>(h); }
int do_magic(MyHandle h, int a, int b)
{
return static_cast<SuperGizmo *>(h)->foo(a, b);
}