Aufrufen einer Variadic-Funktion mit unamed-Argumenten einer anderen Variadic-Funktion

8

Ich habe zwei variadic Funktionen als foo(format, ...) und bar(format, ...) . Ich möchte die Funktion foo so implementieren, dass sie bar mit derselben Argumentliste aufrufen kann. Das heißt,

%Vor%

Wenn Sie zum Beispiel foo("(ii)", 1, 2) aufrufen, wird bar mit denselben Argumenten bar("(ii)", 1, 2) aufgerufen. Wie sollte diese foo -Funktion implementiert werden?

PS: Die Funktion bar stammt aus einer Legacy-Bibliothek, deren Interface ich nicht ändern kann.

    
Richard 21.03.2011, 20:58
quelle

4 Antworten

11

Kann nicht ausgeführt werden, solange Sie nur einen Haufen haben, wenn Funktionen mit ... arguments.

funktionieren

Sie müssen solche Dinge vorausplanen und jede variadische Bedeutung zweistufig umsetzen

%Vor%

Sobald Sie jede Ihrer Variadic-Funktionen durch ein Paar va_list * -Funktion und ... -Funktion implementiert haben, können Sie die Aufrufe mit den va_list * -Versionen der Funktionen

delegieren %Vor%     
AnT 21.03.2011, 21:04
quelle
6

GCC kann Funktionsaufrufe zur Laufzeit erstellen .

%Vor%

??? ist die Menge an Stack-Platz, die die Argumente einnehmen, was nicht unbedingt trivial zu berechnen ist: Sie müssen verstehen, was die Argumente sind und architekturspezifische Details darüber, wie sie übergeben werden.

Andere GCC-Erweiterungen ermöglichen weitere Tricks mit Makros und Inline-Funktionen.

    
ephemient 21.03.2011 21:23
quelle
3

Kurze Antwort - Sie können nicht. Mache eine Leiste als va_list . Wenn Sie bereit sind, dies auf einen bestimmten Compiler zu beschränken, könnten Sie dies wahrscheinlich mit Inline-Assemblierung tun, aber mit Standard C oder C ++ ist das nicht möglich.

Sie sollten generell Ihre vararg-Funktionen immer in va_list implementieren und dann eine Wrapper-Ellipsenfunktion erstellen, die die echte va_list -Funktion aufruft.

    
Erik 21.03.2011 21:02
quelle
1

Dies funktioniert in C ++:

%Vor%

Ausgabe:

%Vor%

Natürlich ist das C ++ 0x spezifisch, aber es funktioniert in meiner nicht super-aktuellen Version von gcc. Siehe auch: Ссылка

Aktualisieren Beispiel für vollständige Länge hinzugefügt.

    
phooji 21.03.2011 21:04
quelle

Tags und Links