我有一个树形遍历API,看起来像这样
treeTraverse(Tree *ptr, (void *) call_back(Tree *ptr));
此API遍历树并使用每个条目调用回调函数。我想遍历树并调用函数
myFunc(Tree *ptr, int a, int b)
对于树上的每个条目,但正如您在上面看到的,回调函数只接受一个参数,因此注册myFunc()作为回调函数将无法工作。我该如何解决这个问题。
重写treeTraverse()API以接受变量参数是不可行的,因为它是一个框架API,如果我需要更改它,我将不得不让很多人对它进行审核。不是我期待的东西,因为我只需要实现一个非常小的功能。
另一种方法是使变量'a'和' 'b'全局,所以myFunc可以访问它。但这个解决方案看起来很难看。
还有其他方法吗?
答案 0 :(得分:2)
根据您的具体情况,将a
和b
全局视为合理的解决方案。但是要小心,它不是线程或递归安全的。
如果只能向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中,这是一个更好的解决方案。