2012-09-12 68 views
0

我有一个树遍历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

你可以添加一个treeTraverseWithParms函数到API吗? – Kwariz

+0

具有内部连接的全局变量应该是可以的(尽管它们确实具有静态生命周期,当一项次要任务需要多个少数整数时,这可能是一个问题)。你的“API”看起来更像是一个函数调用语句,而不是函数声明符。 –

+0

这不能编译“错误:预期声明说明符或'...'之前'('令牌' – fork0

回答

2

根据您的情况,制作ab全球似乎是一个合理的解决方案。但要小心,它不是线程或递归安全的。

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); 

这是最标准的特点:

如果你能一个额外的参数添加到treeTraverse它被传递到回调,那么你可以使用一个结构传递的额外的参数任意数量使用回调的代码。您应该坚持将其添加到框架API中,这是一个更好的解决方案。

+0

感谢您的建议。肯定需要改变,我懒得经历这个过程。:) – Pratt