Ich habe also zwei Funktionen, die beide ähnliche Argumente haben
void example(int a, int b, ...);
void exampleB(int b, ...);
Nun example
ruft exampleB
, aber wie kann ich entlang der Variablen in der Variablenargumentliste übergeben , ohne Modifizierung exampleB
(wie dies bereits an anderer Stelle auch verwendet wird ).
c++
variadic-functions
Nicht verfügbar
quelle
quelle
Antworten:
Sie können es nicht direkt tun; Sie müssen eine Funktion erstellen, die Folgendes übernimmt
va_list
:quelle
, ...
in der Signatur enthält. Wenn Sie die Variablenargumente in a konvertiert habenva_list
, können Sie dieva_list
an eine andere Funktion übergeben, die nur a akzeptiertva_list
, aber diese Funktion (oder eine, die sie aufruft) muss eine Möglichkeit haben, zu wissen, was in der enthalten istva_list
.Vielleicht werfen Sie hier einen Stein in einen Teich, aber mit variablen C ++ 11-Vorlagen scheint es ziemlich in Ordnung zu sein:
Zumindest funktioniert es mit
g++
.quelle
args...
Sie sollten Versionen dieser Funktionen erstellen, die eine va_list enthalten, und diese übergeben. Schauen Sie sich
vprintf
als Beispiel:quelle
Ich wollte auch printf einpacken und fand hier eine hilfreiche Antwort:
So übergeben Sie eine variable Anzahl von Argumenten an printf / sprintf
Ich war überhaupt nicht an Leistung interessiert (ich bin sicher, dass dieser Code auf verschiedene Weise verbessert werden kann, zögern Sie nicht :)), dies ist nur für das allgemeine Debugprinting gedacht, also habe ich Folgendes getan:
was ich dann so nutzen kann
Die c ++ - Ostreams sind in einigen Aspekten wunderschön, aber praktisch werden sie schrecklich, wenn Sie so etwas mit kleinen Zeichenfolgen wie Klammern, Doppelpunkten und Kommas zwischen den Zahlen drucken möchten.
quelle
Übrigens haben viele C-Implementierungen eine interne v? Printf-Variante, die meiner Meinung nach Teil des C-Standards sein sollte. Die genauen Details variieren, aber eine typische Implementierung akzeptiert eine Struktur, die einen Zeichenausgabefunktionszeiger und Informationen enthält, die angeben, was passieren soll. Auf diese Weise können printf, sprintf und fprintf denselben 'Kern'-Mechanismus verwenden. Zum Beispiel könnte vsprintf so etwas sein wie:
Die Funktion core_printf ruft dann p_inf-> func für jedes auszugebende Zeichen auf. Die Ausgabefunktion kann dann die Zeichen an die Konsole, eine Datei, eine Zeichenfolge oder etwas anderes senden. Wenn die Implementierung die Funktion core_printf (und den verwendeten Setup-Mechanismus) verfügbar macht, kann sie mit allen möglichen Variationen erweitert werden.
quelle
Eine mögliche Möglichkeit ist die Verwendung von #define:
quelle
Basierend auf dem Kommentar, den Sie einschließen
vsprintf
und der als C ++ gekennzeichnet ist, würde ich vorschlagen, dies nicht zu versuchen, sondern Ihre Benutzeroberfläche so zu ändern, dass stattdessen C ++ - iostreams verwendet werden. Sie haben Vorteile gegenüber denprint
Funktionen, wie z. B. die Typensicherheit und die Möglichkeit, Elemente zu drucken,printf
die nicht verarbeitet werden können. Einige Überarbeitungen könnten in Zukunft erhebliche Schmerzen ersparen.quelle
Mit dem neuen C ++ 0x-Standard können Sie dies möglicherweise mithilfe verschiedener Vorlagen erledigen oder sogar den alten Code in die neue Vorlagensyntax konvertieren, ohne etwas zu beschädigen.
quelle
Dies ist der einzige Weg, es zu tun .. und der beste Weg, es auch zu tun ..
quelle