回调函数的变量参数

时间:2012-09-12 19:24:36

标签: c callback

我有一个树形遍历API,看起来像这样

treeTraverse(Tree *ptr, (void *) call_back(Tree *ptr));

此API遍历树并使用每个条目调用回调函数。我想遍历树并调用函数

myFunc(Tree *ptr, int a, int b)

对于树上的每个条目,但正如您在上面看到的,回调函数只接受一个参数,因此注册myFunc()作为回调函数将无法工作。我该如何解决这个问题。

重写treeTraverse()API以接受变量参数是不可行的,因为它是一个框架API,如果我需要更改它,我将不得不让很多人对它进行审核。不是我期待的东西,因为我只需要实现一个非常小的功能。

另一种方法是使变量'a'和' 'b'全局,所以myFunc可以访问它。但这个解决方案看起来很难看。

还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

根据您的具体情况,将ab全局视为合理的解决方案。但是要小心,它不是线程或递归安全的。

如果只能向treeTraverse添加一个传递给回调的额外参数,那么你可以使用结构传递任意数量的额外参数:

void treeTraverse(Tree *ptr,
                  (void *) call_back(Tree *ptr, void *arg),
                  void *call_back_arg);
struct {
  int a;
  int b;
} args = {...};
treeTraverse(ptr, myCallback, &args);

这是大多数使用回调的代码的标准功能。你应该坚持将它添加到你的框架API中,这是一个更好的解决方案。