passer beaucoup d’arguments à une fonction C

Comment puis-je passer beaucoup d’arguments à une fonction C? En supposant que j’ai cette fonction:

void f(int n, char* a, char* b, ...) 

Je veux un nombre indéfini d’arguments char *. Comment puis-je le faire?

Ce dont vous avez besoin est appelé nombre variable de fonctions d’argument, vous pouvez y lire: 9.9. Un nombre variable d’arguments est un bon tutoriel.

Une brève théorie en quatre points vous aidera à comprendre mon code:

  1. le fichier d’en-tête doit être inclus, il introduit un nouveau type, appelé va_list, et trois fonctions agissant sur des objects de ce type, appelées va_start, va_arg, and va_end .
  2. va_start: est une macro pour définir arg_ptr au début de la liste ap des arguments facultatifs.
  3. va_arg: utilise ce pointeur de stack enregistré et extrait le nombre d’octets correct pour le type fourni
  4. va_end: est une macro pour réinitialiser ap , une fois que tous les arguments ont été récupérés, va_end réinitialise le pointeur sur NULL.

Cette théorie ne suffit pas, mais ci-dessous, un exemple (comme vous le souhaitez) vous aidera à comprendre le stream de travail / et les étapes de base: ( lisez le commentaire pour chacune des 4 étapes )

 //Step1: Need necessary header file #include  void f(int first, char* a, char* b, ...){ va_list ap; // vlist variable int n; // number char aa, int i; float f; //print fix numbers of arguments printf("\n %d, %s, %s\n", first, a, b); //Step2: To initialize `ap` using right-most argument that is `b` va_start(ap, b); //Step3: Now access vlist `ap` elements using va_arg() n = va_arg(ap, int); //first value in my list gives number of ele in list while(n--){ aa = (char)va_arg(ap, int); // notice type, and typecast i = va_arg(ap, int); f = (float)va_arg(ap, double); printf("\n %c %d %f \n", aa,i, f); } //Step4: Now work done, we should reset pointer to NULL va_end(ap); } int main(){ char* a = "Aoues"; char* b = "Guesmi"; f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1); // ^ this is `n` like count in variable list return 1; } 

Qui fait ça?

 ~$ ./a.out 2, Aoues, Guesmi a 3 6.700000 b 5 5.500000 A 0 0.100000 

Une brève explication de mon code sera utile pour les futurs utilisateurs:

  1. En fait, la fonction est un nombre fixe d’arguments suivi d’un nombre variable d’arguments. Et l’argument le plus à droite de la fonction (dans la liste des arguments fixes char* b dans notre fonction f() ) utilise uniquement pour initialiser la liste viable ap .
  2. La fonction f() ci-dessus poing lit n valeur égale à 3 ( lire le commentaire dans le menu principal ). Dans f() , while(n--) exécuté trois fois et chaque fois en boucle, en utilisant la macro va_arg() nous va_arg() trois valeurs.
  3. Si vous remarquez que je lis les deux premières ints puis un double , Où, car j’envoie char, int, float ( remarque dans la section principale où j’appelle f () ). c’est parce que le type automatique est promu en cas de liste d’arguments variables (lire en détail ci-dessus lisk)

Voici un autre lien utile de MSDN: va_arg, va_end, va_start .

( laissez-moi savoir si vous avez besoin de plus d’aide à ce sujet )

Utilisez varargs (recherchez vous-même, le contenu utilisé par l’appelé pour lire les stdarg.h trouve dans stdarg.h ).

Notez qu’il n’y a aucun moyen pour l’appelé de déterminer automatiquement le nombre d’arguments réellement transmis. Ainsi, par exemple, il peut s’agir de n , et il vous suffit de faire confiance à l’appelant pour que n correct.