142 votes

Passer des arguments variables à une autre fonction qui accepte une liste d'arguments variables

Donc, j'ai 2 fonctions qui les deux ont des arguments similaires

 void example(int a, int b, ...);
void exampleB(int b, ...);
 

Maintenant, example appelle exampleB , mais comment puis-je transmettre les variables de la liste des arguments de variables sans modifier exampleB (car cela est déjà utilisé ailleurs aussi).

151voto

Jonathan Leffler Points 299946

Vous ne pouvez pas le faire directement; vous devez créer une fonction qui prend va_list :

 #include <stdarg.h>

static void exampleV(int b, va_list args);

void example(int a, int b, ...)
{
    va_list args;
    va_start(args, b);
    exampleV(b, args);
    va_end(args);
}

void exampleB(int b, ...)
{
    va_list args;
    va_start(args, b);
    exampleV(b, args);
    va_end(args);
}

static void exampleV(int b, va_list args)
{
    ...whatever you planned to have exampleB do...
    ...except it calls neither va_start nor va_end...
}
 

16voto

tenfour Points 16759

vous devriez créer des versions de ces fonctions qui prennent une liste de va et les transmettre. Regardez vprintf titre d'exemple:

 int vprintf ( const char * format, va_list arg );
 

3voto

supercat Points 25534

Par ailleurs, de nombreuses implémentations C a v?printf variations qui, à mon humble avis doit avoir été une partie de la norme. Les détails exacts varient, mais une implémentation typique acceptera une structure contenant un personnage-sortie de la fonction de pointeur et de l'information en disant que ce qui est censé se produire. Cela permet de printf, sprintf, et fprintf à tous utiliser le même "de base" mécanisme. Par exemple, vsprintf pourrait être quelque chose comme:

void s_out(PRINTF_INFO *p_inf, char ch)
{
 (*(p_inf->destptr)++) = ch;
p_inf->result++;
}

int vsprintf(char *dest, const char *fmt, va_list args)
{
 PRINTF_INFO p_inf;
 p_inf.destptr = dest;
 p_inf.resultat = 0;
 p_inf.func = s_out;
core_printf(&p_inf,esf,args);
}

Le core_printf fonction des appels p_inf->func pour chaque caractère à la sortie; la fonction de sortie peut alors envoyer les caractères de la console, un fichier, une chaîne, ou quelque chose d'autre. Si la mise en œuvre expose le core_printf fonction (et quelle que soit la configuration du mécanisme, on utilise), on peut l'étendre à toutes sortes de variations.

1voto

Mark B Points 60200

En vous basant sur le commentaire que vous encapsulez vsprintf , et que ceci est étiqueté en C ++, je vous suggère de ne pas essayer de le faire, mais de changer votre interface pour utiliser plutôt iostream C ++. Elles présentent des avantages par rapport à la gamme de fonctions print , telles que la sécurité des types et la possibilité d’imprimer des éléments que printf ne seraient pas en mesure de gérer. Quelques retouches maintenant pourraient épargner beaucoup de douleur à l’avenir.

0voto

David Points 1773

En utilisant le nouveau standard C ++ 0x, vous pourrez peut-être utiliser des modèles variadiques ou même convertir l'ancien code en nouvelle syntaxe sans rien casser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X