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,
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.
Kann nicht ausgeführt werden, solange Sie nur einen Haufen haben, wenn Funktionen mit ...
arguments.
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
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.
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.
Tags und Links c c++ variadic-functions