我需要用 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++ 回调实例应该在外部?