我的圖書館提供了一個回調點,我的圖書館用戶可以註冊以獲取信息。回調的一般形式是int
,後面跟着各種類型取決於int值的參數。因此,我定義了回調類型和函數來設置它如下。什麼是C回調函數的參數更好:va_list或省略號?
typedef void (* callback_func_t)(int type, ...);
void set_callback_func(callback_func_t callback);
在我的庫中,我一直在調用這個函數,作爲用戶設置函數,或者我提供的默認函數。有用。
現在,我想添加一個間接級別,以便能夠調用多個註冊的回調。麻煩的是我的內部回調函數仍然需要省略號參數,也必須用省略號調用回調函數。因此,我的內部函數必須解釋type
,從va_list
中解壓參數並將它們作爲callbacj函數的參數。
void internal_callback(int type, ...) {
va_list args;
va_start(args, type);
switch (type) {
case 0: call_callback(type, va_arg(args, int)); break;
// ...
}
va_end(args);
}
但隨後,在用戶執行回調,也會有同樣的va_list
使用以及的參數解釋,根據type
值。解決方案是直接將va_list
作爲參數傳遞給回調函數,使內部回調函數的實現變得明顯。
typedef void (* callback_func_t)(int type, va_list args);
我的問題是:這是很好的做法,定義一個回調函數類型採用va_list
作爲參數?我可以像上面那樣定義我的回調函數類型,但是與頂部定義相比有什麼優點和缺點?