C Arguments variables

Parfois, vous pouvez rencontrer une situation où vous souhaitez qu'une fonction ait un nombre variable d'arguments, plutôt qu'un nombre prédéfini d'arguments.

Le langage C offre une solution pour cette situation, vous permettant de définir une fonction qui peut accepter un nombre variable d'arguments selon des exigences spécifiques.

La méthode de déclaration est :

int func_name(int arg1, ...);

Où, les points de suspension...représentent une liste d'arguments variables.

L'exemple suivant démontre l'utilisation de cette fonction :

int func(int, ... ) { . . . } int main() { func(2, 2, 3); func(3, 2, 3, 4); }

Veuillez noter que la fonctionfunc()Le dernier paramètre est écrit sous forme de points de suspension, c'est-à-dire trois points (...), le paramètre avant les points de suspension estint, qui représente le nombre total d'arguments variables à passer. Pour utiliser cette fonctionnalité, vous devez utiliser lestdarg.hfichier d'en-tête, qui fournit des fonctions et des macros pour implémenter des arguments variables. Les étapes spécifiques sont les suivantes :

  • Définissez une fonction dont le dernier paramètre est constitué de points de suspension, et des paramètres personnalisés peuvent être définis avant les points de suspension.
  • Dans la définition de la fonction, créez une variable de typeva_list, ce type est défini dans le fichier d'en-tête stdarg.h.
  • UtilisationintParamètres etva_start()macro pour initialiserva_listvariable comme liste de paramètres. La macrova_start()est définie dans le fichier d'en-tête stdarg.h.
  • Utilisationva_arg()macro etva_listvariable pour accéder à chaque élément de la liste d'arguments.
  • Utilisez la macrova_end()pour nettoyer la mémoire de la variableva_listassignée.

Les macros couramment utilisées incluent :

  • va_start(ap, last_arg): Initialise la liste d'arguments variables.apest uneva_listUne variable de type,last_argest le nom du dernier paramètre fixe (c'est-à-dire le paramètre avant la liste d'arguments variables). Cette macro fait en sorte queappointe vers le premier paramètre de la liste d'arguments variables.

  • va_arg(ap, type): Obtient le paramètre suivant dans la liste d'arguments variables.apest uneva_listUne variable de type,typeest le type du paramètre suivant. Cette macro renvoie une valeur de typetypela valeur, etapPointe vers l'argument suivant.

  • va_end(ap): Met fin à l'accès à la liste d'arguments variables.apest uneva_listvariable de type. Cette macroapdéfini àNULL。

Suivons maintenant les étapes ci-dessus pour écrire une fonction avec un nombre variable de paramètres et renvoyer leur moyenne :

Exemple

#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /*Initialiser valist pour num arguments*/ va_start(valist, num); /*Accéder à tous les arguments assignés à valist*/ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /*Nettoyer la mémoire réservée à valist*/ va_end(valist); return sum/num; } int main() { printf("Moyenne de 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Moyenne de 5, 10, 15 = %f\n", average(3, 5,10,15)); }

Dans l'exemple ci-dessus, la fonction average() accepte un entier num et un nombre quelconque d'arguments entiers. À l'intérieur de la fonction, une variable va_list de type va_list est utilisée pour accéder à la liste d'arguments variables. Dans la boucle, chaque fois que la macro va_arg() est utilisée pour obtenir l'argument entier suivant et l'afficher. Enfin, à la fin de la fonction, la macro va_end() est utilisée pour terminer l'accès à la liste d'arguments variables.

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants. Il convient de noter que la fonction average()est appelée deux fois, et chaque fois le premier paramètre indique le nombre total d'arguments variables passés. Les points de suspension sont utilisés pour passer un nombre variable d'arguments.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
autres extensions