使用 C 类成员函数作为 C 回调函数
当从 C 代码与 C 库交互时,有必要建立回调。本文探讨了尝试将 C 类成员函数注册为具有特定签名 int a(int , int ) 的 C 函数的回调时遇到的挑战。
主要障碍遇到的问题是非静态成员函数具有类 A* 类型的隐式第一个参数,表示 this 指针。预期的回调函数和提供的 C 类成员函数之间的参数签名不匹配会导致编译错误。
解决方案:
要克服此问题,成员函数必须声明为静态。这消除了隐式第一个参数,允许将 C 类成员函数注册为回调。
替代方法:
如果回调注册机制允许,可以使用替代方法方法是创建一个包装函数。此包装函数可以是常规 C 函数,它将参数转发到所需的 C 类成员函数。通过将包装函数注册为回调,可以通过代理间接调用类成员函数。
示例:
请考虑下面的示例代码:
class A { public: A(); ~A(); int e(int *k, int *j); private: static int e_c(int *k, int *j) { A* this_ptr = reinterpret_cast<A*>(callback_user_data); return this_ptr->e(k, j); } }; A::A() { register_with_library(e_c) }
在上面的代码中,e_c()函数是一个静态包装函数,它转换callback_user_data A* 指针的参数,允许访问 this 指针并随后调用 e() 成员函数。这种方法使得 C 类成员函数能够间接注册为回调,即使它与回调函数的确切签名不匹配。
以上是如何使用 C 类成员函数作为 C 回调?的详细内容。更多信息请关注PHP中文网其他相关文章!