Maison >développement back-end >C++ >Comment puis-je transmettre des arguments variables d'une fonction à une autre avec des listes d'arguments variables ?

Comment puis-je transmettre des arguments variables d'une fonction à une autre avec des listes d'arguments variables ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-08 15:05:11363parcourir

How Can I Pass Variable Arguments from One Function to Another with Variable Argument Lists?

Passer des arguments variables à des fonctions avec des listes d'arguments variables

Lorsque vous travaillez avec des fonctions qui emploient des listes d'arguments variables, le défi de transmettre des arguments d'une fonction à une autre qui accepte un une liste similaire peut survenir.

Considérons l'exemple suivant :

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

Ici, l'exemple appelle exempleB. Une question clé est de savoir comment transmettre les variables de la liste d'arguments de variables de l'exemple à l'exempleB sans modifier l'exempleB (qui peut être utilisé dans d'autres contextes).

Passage direct impossible

Malheureusement, direct le passage d'arguments variables entre fonctions n'est pas possible. Une solution personnalisée est nécessaire pour y parvenir.

Utilisation d'une fonction d'assistance va_list

Pour combler cette lacune, nous pouvons introduire une fonction d'assistance qui accepte une va_list comme argument :

#include <stdarg.h>

static void exampleV(int b, va_list args);

exempleA (renommé par souci de cohérence) est modifié pour utiliser cet assistant fonction :

void exampleA(int a, int b, ...)
{
    va_list args;
    do_something(a);                // Use argument a somehow
    va_start(args, b);
    exampleV(b, args);
    va_end(args);
}

exempleB peut également utiliser la même fonction d'assistance sans aucune modification :

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

Dans exempleV, les opérations réelles qui étaient destinées à être effectuées dans exempleB peuvent être exécutées, sans avoir besoin de va_start ou va_end.

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

En employant cette approche, nous pouvons transmettre efficacement des arguments variables d'une fonction à une autre, sans altérer l'implémentation originale de la deuxième fonction.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn