【发布时间】:2011-05-01 08:08:13
【问题描述】:
我的图书馆提供了一个回调点,我的图书馆用户可以在其中注册以获取信息。回调的一般形式是int,后跟各种类型取决于 int 值的参数。因此,我定义了回调类型和设置它的函数如下。
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 作为参数的回调函数类型是一种好习惯吗?我可以像上面那样定义我的回调函数类型,但是和上面的定义相比,有什么优缺点呢?
【问题讨论】:
标签: c callback ellipsis variadic-functions