Моя библиотека предлагает точку обратного вызова, где пользователи моей библиотеки могут зарегистрироваться для получения информации.Общая форма обратного вызова - 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
в качестве аргумента?Я могу определить свой тип функции обратного вызова, как указано выше, но каковы плюсы и минусы по сравнению с определением сверху?