Ma bibliothèque offre un point de rappel où les utilisateurs de ma bibliothèque peuvent s'inscrire pour obtenir des informations. La forme générale du rappel est un int
suivi de divers paramètres dont le type dépend de la valeur int. Par conséquent, j'ai défini le type de rappel et la fonction pour le définir comme suit. Dans ma bibliothèque, j'appelle cette fonction tout au long, étant la fonction définie par l'utilisateur, ou la fonction par défaut que je fournis. Ça marche.Quoi de mieux pour les paramètres d'une fonction de rappel C: va_list, ou ellipsis?
Maintenant, je voudrais ajouter un niveau d'indirection, pour pouvoir appeler plusieurs callbacks enregistrés. Le problème est que ma fonction de rappel interne qui prend encore des paramètres d'ellipse, doit également appeler la fonction de rappel avec ellipse. En conséquence, ma fonction interne doit interpréter le type
, déballer les paramètres du va_list
et les donner comme paramètres à la fonction 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);
}
Mais, dans la mise en œuvre du rappel de l'utilisateur, il y aura aussi le même usage va_list
, et l'interprétation des arguments, selon la valeur de type
. La solution consiste à passer directement le va_list
en tant qu'argument à la fonction de rappel, ce qui rend l'implémentation de la fonction de rappel interne évidente.
typedef void (* callback_func_t)(int type, va_list args);
Ma question est: est-il une bonne pratique de définir un type de fonction de rappel qui prend va_list
comme argument? Je peux définir mon type de fonction de rappel comme ci-dessus, mais quels sont les avantages et les inconvénients par rapport à la définition en haut?