C++ ライブラリを C でラップする必要があります。この C++ ライブラリは、コールバック関数を定義します。例えば:
// from C++ library
typedef X CallbackFn(Y y); // X and Y are classes
class Z
{
public:
void addCallback( CallbackFn* fn ) { callbackFn = fn; }
private:
CallbackFn* callbackFn;
};
C ラッパーでは、C++ コールバックを呼び出す新しい C コールバックを定義できます。このようなもの:
// in C wrapper
extern "C" {
typedef int CallbackFnC(int n, ... );
CallbackFnC *callbackFnC;
int addCallback(void* handle, CallbackFnC* fn) // handle is pointer to Z instance
{
callbackFnC = fn;
((Z*)handle)->addCallback(callbackFnCPP);
}
}
X callbackFnCPP(Y y)
{
int rtn = callbackFnC(y.n, ...);
return X(rtn);
}
ここで、Y の関連メンバーを C コールバック関数の引数にマップでき、C の戻り値から戻り値の型 X を十分に構築できると仮定します。
これはうまくいきますか?新しい C コールバックを定義する方法はありませんか?
新しい C コールバックは の内側にある必要がextern "C"
あり、C++ コールバックの定義済みインスタンスは外側にある必要がありますか?