1

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

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

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

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

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

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

另一种方法是将变量“a”和“b”设为全局变量,以便 myFunc 可以访问它。但这个解决方案看起来很丑陋。

有没有其他方法可以解决这个问题?

4

1 回答 1

3

鉴于您的情况,制作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 中,这是一个更好的解决方案。

于 2012-09-12T19:33:38.440 回答