繁体   English   中英

将C ++成员函数映射到C回调

[英]Map C++ member function to C callback

在C ++项目中,我使用C库访问某些硬件。 C绑定包括回调,用于通知某些输入引脚上的更改。 回调函数如下所示: void callback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)

在我的实现中,我有一个SensorController类,该类具有一个应接收回调的成员函数。 成员函数如下所示: void SensorController::pinChanged(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)

现在我想知道,什么是避免将pinChanged函数pinChanged静态函数以便能够将函数分配给回调的最干净的方法?

使用user_data指针可以为您提供一个指向拥有回调的类的指针。 例如。

void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
{
    static_cast<Example *>(user_data)->Callback(port, interrupt_mask, value_mask);
}

class Example
{
public:

    Example()
    {
        //setup callback here - i dont know what library you're using but you should be able to pass a this pointer as user_data
        init_lib(fictionalparameter1, fictionalparameter2, this);
    }

private:

     void   Callback(char port, uint8_t interrupt_mask, uint8_t value_mask)
     {
         //callback handler here...
     }

     friend void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data);
};

接收回调的函数只能是:

  1. 普通功能
  2. 静态功能

为什么不能成为成员类函数?

这都是关于指针的。 指向普通函数或静态函数的指针是存储器的地址。 指向成员类函数的指针是一个偏移量-应该添加到对象指针(this)以访问该方法的数字。 [请参阅jv110评论]

在C ++中,成员函数具有指向对象的隐式参数(成员函数内部的this指针)。 普通C函数可以被认为与成员函数具有不同的调用约定,因此其指针的类型(指针到成员函数与指针到函数)是不同且不兼容的。 C ++引入了一种新型的指针,称为成员指针,只有提供一个对象才能调用它。 https://isocpp.org/wiki/faq/pointers-to-members#addr-of-memfn

您可以在回调中使用user_data来访问类成员方法,如user1320881所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM