如何从C ++代码优雅地处理C回调?

时间:2015-03-22 23:47:04

标签: c++ c

我正在使用C库,用户应该注册int (*functionPtr)(int,int);回调。 然后,处理一些文件,并且在文件处理期间,用户使用先前给定的函数接收回调,对于单个文件处理,最多可接收数千个文件。

我的问题是,如何管理此类问题的状态?

例如,我想计算回调被调用的次数。我想这样做的唯一方法是:

int c = 0; //global variable
int callback(int i, int j) {
++c;
}

这基本上不是很漂亮,迫使我管理全局变量。

有没有办法在C ++中有效地做到这一点?在我的情况下,我可以访问C ++ 11

1 个答案:

答案 0 :(得分:3)

标准方法是支持上下文指针:

void myAPI(void (*f)(void *, int, int), void *context) {
   ...
   // Call the callback passing the provided context
   f(context, x, y);
   ...
}

然后,如果需要,用户可以从上下文中恢复自定义数据...例如

void inc_counter(void *context, int x, int y) {
    *((int *)context) += 1;
}

void foo() {
    int count = 0;
    myAPI(inc_counter, &count);
}

换句话说,我们的想法是在回调接口中添加一个不透明的void *参数,并在调用函数时将void *值添加到该参数中。

这并没有添加任何耦合,但解决了C没有闭包的问题。