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

时间:2016-04-16 16:18:44

标签: c++ c callback

在C ++项目中,我使用C库来访问某些硬件。 C-Binding包括回调以通知某些输入引脚的更改。 回调函数如下所示: 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函数静态能够将函数分配给回调的最简洁方法是什么?

2 个答案:

答案 0 :(得分:6)

使用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 :(得分:0)

接收回调的功能只能是:

  1. 普通功能
  2. 静态功能
  3. 为什么它不能成为成员类函数?

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

      

    在C ++中,成员函数有一个指向的隐式参数   对象(成员函数内的this指针)。正常C.   函数可以被认为具有不同的调用约定   从成员函数,所以他们的指针类型   (指向成员函数的指针与指向函数的指针)是不同的   不相容。 C ++引入了一种新类型的指针,称为a   指向成员的指针,只能通过提供对象来调用。   https://isocpp.org/wiki/faq/pointers-to-members#addr-of-memfn

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