Disons que j'ai une fonction variadique foo(int tmp, ...)
, en appelant la fonction foo j'ai besoin de savoir combien d'arguments il y a. Je suis au courant de deux façons de savoir combien d'arguments il y a:Utilise des fonctions variadiques dans C89 sans passer le nombre d'arguments ou un argument final?
Utilisez un dernier argument lors de l'appel foo, comme -1, de sorte que votre appel de fonction sera comme ceci:
foo(tmp, 1, 2, 9, -1)
et quand vous êtes à l'intérieur foo et un appel va_arg retourne -1 vous savez que vous avez lu tous les arguments de la fonctionAjouter un argument de plus dans foo où le programmeur aura le nombre total d'arguments, de sorte que vous aurez des appels à foo comme ceci:
foo(tmp, 5, 1, 2, 3, 4, 5)
oufoo(tmp, 2, 7, 8)
J'avais l'habitude de suivre la première voie et une fois eu le bug suivant. Avec le code:
expr_of_type(expr, boolexpr_e, newtable_e, nil_e, -1)
où expr_of_type était une fonction variadique et vérifiait si expr (le premier argument) est l'un des types suivants (ou boolexpr_e new_table_e ou nil_e avait tout type d'un type énuméré). Je un mégarde écrit:
expr_of_type(expr, boolexpr_e, newtable_e, nil_e -1)
J'ai oublié la virgule entre nil_e et -1, car nil_e avait un type énuméré, nil_e - 1 était une expression valide et parce que nil_e n'était pas la fonction 0 variadique donnée lorsque vous essayez de Obtenir les arguments expr_of_type n'a pas trouvé -1 comme dernier argument et a continué la recherche en créant un bug qui m'a pris du temps pour le découvrir.
Je ne trouve pas non plus la deuxième manière sympa, car lorsque vous ajoutez ou supprimez un argument de plus d'une fonction variadique, vous devez changer le paramètre qui contient le nombre total d'arguments. Dans la recherche d'une meilleure façon d'utiliser/créer des fonctions variadiques, j'ai trouvé variadic macros qui peut résoudre le bug que j'avais lors de l'utilisation de la première façon. Mais les macros variées sont disponibles pour la norme C99. Je cherchais un meilleur moyen d'utiliser/créer des fonctions variadiques en C89. Des idées?
L'utilisation de 'enum' ou' const int' entraînerait le même problème lors de l'oubli d'une virgule? –
Non, ce ne sera pas le cas. Si vous avez 'const int VARARG_SENTILEL = -1;' quand vous oubliez une virgule, vous aurez quelque chose comme ceci 'nil_e VARARG_SENTINEL' qui donne une erreur de compilation. La même chose se produit lorsque vous utilisez 'enum {VARARG_SENTINEL = -1};'. Avec les deux solutions lorsque vous oubliez une virgule, c'est comme si vous aviez 'number1 number2' (par exemple' 2 3') qui est une expression invalide, mais en utilisant -1 comme je le faisais, vous auriez 'number - 1' qui est un expression valide. –