我正在使用C库,用户应该注册int (*functionPtr)(int,int);
回调。
然后,处理一些文件,并且在文件处理期间,用户使用先前给定的函数接收回调,对于单个文件处理,最多可接收数千个文件。
我的问题是,如何管理此类问题的状态?
例如,我想计算回调被调用的次数。我想这样做的唯一方法是:
int c = 0; //global variable
int callback(int i, int j) {
++c;
}
这基本上不是很漂亮,迫使我管理全局变量。
有没有办法在C ++中有效地做到这一点?在我的情况下,我不可以访问C ++ 11
答案 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没有闭包的问题。