我的图书馆提供了一个回调点,我的图书馆用户可以注册以获取信息。回调的一般形式是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
作为参数?我可以像上面那样定义我的回调函数类型,但是与顶部定义相比有什么优点和缺点?