我有 PiGPIO 库提供的以下 API 代码。基本上,它允许您在引脚状态更改时设置回调函数。
通常 API 看起来像这样:
typedef void (*gpio_callback_t)(int, int, uint32_t);
int gpioSetAlertFunc(int, gpio_callback_t)
它可以这样调用:
void callback_func(int pin, int NewLevel, uint32_t CurrentTicks)
{
// Callback process
}
int main()
{
// Setting up callback function
gpioSetAlertFunc(10, callback_func)
// Do stuff while callback will be called independently
}
现在上面的代码可以完美运行了!
当我尝试将此代码包装在 C++ 类中时,出现了大问题。 该类应如下所示:
class Pin
{
public:
Pin()
{
gpioSetAlertFunc(10, this->internal_gpio_callback) );
}
void internal_callback_func(int pin, int level, uint32_t tick)
{
cout << "New level: " << pin << " " << level;
}
}
问题是不允许引用该函数,因为它不是静态函数。更复杂的事情,我不能只是让回调函数静态化。该回调函数将与其余的类方法及其内部变量进行大量交互。
你知道解决这个问题的方法吗?或者可能是使用指针或其他东西的肮脏黑客?
最佳答案
完整的 C 风格回调将接受 void*
参数来传递任意用户定义的数据。由于这个没有,它是图书馆设计中的一个错误。向库作者提出问题。
要解决此问题,您需要创建一个闭包 作为 C 兼容函数。标准 C 或 C++ 无法做到这一点。不过,有一些库(不符合标准且不可移植)可以解决这个问题。一个这样的库是 GNU libffcall , 另一个是 libffi .两者都允许您创建行为类似于普通 C 函数的闭包。
关于c++ - 在类内部处理回调时必须调用非静态成员函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550214/