Comment remplir une va_list

Si j’ai une liste va_list, je sais comment en extraire tous les éléments:

void printInts(int n,...) { va_list va; va_start(va, n); for(unsigned int i=0; i<n; i++) { int arg=va_arg(va, int); printf("%d",arg); } va_end(va); } 

Ainsi, lorsque j’appelle printInts (3,1,2,3), la liste va_list est remplie de tous les parameters.
Mais comment puis-je remplir manuellement une liste va_list sans utiliser le fichier va_start? Je veux dire que je veux quelque chose comme:

 va_list va; push_arg(va, int, 5); // And so on until I fill all parameters ... 

J’ai besoin de cela car il y a une fonction qui accepte un va_list comme argument et je ne sais pas comment remplir cette va_list de tous ses parameters.

Il n’est pas possible de remplir explicitement une va_list.

Vous devriez écrire une fonction wrapper. Supposons que vous deviez appeler votre fonction foo, au lieu de remplir manuellement une liste va_list, vous définissez une nouvelle fonction comme ceci:

 void call_foo(int arg1, ...) { va_list ap; va_start(ap, arg1); foo(arg1, ap); va_end(ap); } 

Vous pouvez maintenant appeler foo , qui prend une va_list, comme bon vous semble, en effectuant par exemple call_foo (1,2,3,4) ;, call_foo (1, 1, “Hello”); etc.

Cela vous permettra seulement de spécifier les arguments lors de la compilation, vous ne pouvez pas construire les arguments lors de l’exécution.

Normalement, ces fonctions viennent par paires. Si vous avez une fonction “va-accepting”, il est facile d’en créer une autre:

 void printInts_v(int n, va_list ap) { unsigned int i=0; for(i=0; i 

Cette fonction peut être appelée de cette façon:

 void printInts(int n,...) { va_list ap; va_start(ap, n); printInts_v(n, ap); va_end(va); } 

Mais je ne pense pas qu'il existe un moyen de pré-remplir de manière va_list une liste va_list pour une utilisation ultérieure.

Si vous travaillez sur une architecture et que la portabilité n’est pas un problème, vous pouvez toutefois créer quelque chose par vous-même. Comment faire exactement cela dépend de la plateforme.

Je ne pense pas qu’il existe un moyen standard de faire cela. D’un autre côté, une telle va_list pré-remplie serait plutôt inutile, car il n’y a aucun moyen de la ” va_list connaître le nombre et les types d’arguments disponibles.