Maison >développement back-end >C++ >Comment transmettre des arguments variables entre des fonctions C avec des listes d'arguments variables ?

Comment transmettre des arguments variables entre des fonctions C avec des listes d'arguments variables ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-12 12:32:13397parcourir

How to Pass Variable Arguments Between C Functions with Variable Argument Lists?

Comment transmettre des arguments variables entre des fonctions avec des listes d'arguments variables

Problème :

Vous avez deux fonctions, exemple ( ) et exampleB(), avec des listes d'arguments variables similaires :

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

Vous devez appeler example() depuis l'intérieur exampleB() sans modifier la liste d'arguments variables de cette dernière, comme elle est utilisée ailleurs.

Solution :

Malheureusement, il n'existe pas de méthode directe pour passer des arguments variables en C . Pour y parvenir, vous devez définir une fonction d'assistance qui prend un paramètre va_list. Voici un exemple :

#include <stdarg.h>

static void exampleV(int b, va_list args);

void exampleA(int a, int b, ...)    // Renamed for consistency
{
    va_list args;
    do_something(a);                // Use argument a somehow
    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...
}

Dans cette configuration :

  • exampleV() est la fonction d'assistance qui prend un argument va_list.
  • do_something(a) est un exemple d'utilisation de l'argument a dans exampleA().
  • exampleV() est appelé à la fois depuis exampleA() et exampleB() avec la liste d'arguments variables correspondante.
  • exampleV() effectue les opérations initialement prévues pour exampleB() mais n'appelle pas va_start() ou va_end().

Par en ajoutant exampleV() comme intermédiaire, vous pouvez transmettre les arguments variables à exampleB() sans modifier son implémentation d'origine.

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