363 Stimmen

Übergabe einer variablen Anzahl von Argumenten

Angenommen, ich habe eine C-Funktion, die eine variable Anzahl von Argumenten annimmt: Wie kann ich eine andere Funktion aufrufen, die eine variable Anzahl von Argumenten erwartet, und dabei alle Argumente übergeben, die in die erste Funktion eingegangen sind?

Beispiel:

void format_string(char *fmt, ...);

void debug_print(int dbg_lvl, char *fmt, ...) {
    format_string(fmt, /* how do I pass all the arguments from '...'? */);
    fprintf(stdout, fmt);
 }

-5voto

Jim Punkte 5

Ich bin mir nicht sicher, ob dies bei allen Compilern funktioniert, aber bei mir hat es bisher funktioniert.

void inner_func(int &i)
{
  va_list vars;
  va_start(vars, i);
  int j = va_arg(vars);
  va_end(vars); // Generally useless, but should be included.
}

void func(int i, ...)
{
  inner_func(i);
}

Sie können das ... zu inner_func() hinzufügen, wenn Sie wollen, aber Sie brauchen es nicht. Es funktioniert, weil va_start die Adresse der angegebenen Variablen als Startpunkt verwendet. In diesem Fall geben wir ihm einen Verweis auf eine Variable in func(). Sie verwendet also diese Adresse und liest die nachfolgenden Variablen auf dem Stack. Die Funktion inner_func() liest von der Stack-Adresse von func(). Sie funktioniert also nur, wenn beide Funktionen das gleiche Stacksegment verwenden.

Die Makros va_start und va_arg funktionieren im Allgemeinen, wenn Sie ihnen eine beliebige var als Ausgangspunkt geben. Wenn Sie wollen, können Sie also Zeiger auf andere Funktionen übergeben und diese ebenfalls verwenden. Sie können Ihre eigenen Makros leicht genug erstellen. Alles, was die Makros tun, ist das Typisieren von Speicheradressen. Allerdings ist es lästig, sie für alle Compiler und Aufrufkonventionen zu erstellen. Daher ist es im Allgemeinen einfacher, die Makros zu verwenden, die mit dem Compiler geliefert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X