2012-09-12 100 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