Angenommen, ich habe eine Methode mit der Signatur:
%Vor%Und ich möchte, dass es eine Zeichenfolge meiner Wahl vorlegt (z. B. @ "Foo:"). Ich denke, der beste Weg ist, [myString initWithFormat: arguments:] zu verwenden, aber wie würden Sie diese Methode implementieren?
Der Grund, warum ich annahme, dass va_start () ein (char *) aufnehmen kann, liegt an dem Beispiel, das ich auf der Handbuchseite von STDARG (3) . Fühlen Sie sich frei, die Methode komplett neu zu schreiben, wenn ich es total falsch mache.
Ich denke, was Sie wollen, ist etwas wie:
%Vor% Die Makros stdarg.h
va_
* werden verwendet, wenn eine Funktion (oder in diesem Fall eine Methode) eine variable Anzahl von Argumenten akzeptiert, wie in " ...
" angegeben. va_start()
wird verwendet, um den Anfang von wo die variable Anzahl von Argumenten beginnt, zu finden. Als solches muss es ein letztes Argument von functions / methods (das gerade vor dem " ...
") kennen, um zu bestimmen, wo die variable Anzahl von Argumenten beginnt. Dies ist eine etwas vereinfachte Erklärung, denn was tatsächlich unter der Haube passiert, ist sehr ABI / Compiler-spezifisch. Der wichtigste Punkt ist, dass das zweite Argument für va_start()
immer der Name der Variablen 'kurz vor dem' ...
'' ist.
va_end()
sollte "aufgerufen" werden (es ist wirklich ein Makro, keine Funktion) für maximale Portabilität. Wiederum ist diese ganze Sache mit variablen Argumenten eine tiefe, tiefschwarze Magie. Abhängig von den Besonderheiten von Compiler und ABI kann va_end()
überhaupt nichts tun. Auf der anderen Seite kann die Verwendung von va_end()
dazu führen, dass Ihr Programm abstürzt, wenn die return
-Anweisung erreicht wird, da der Stack-Frame (falls vorhanden) nicht mehr richtig eingerichtet ist, um eine Rückgabe durchzuführen.
Sie haben es fast schon; nur ein paar Verbesserungen:
%Vor%Das sollte tun, wonach Sie suchen.
Tags und Links objective-c nsstring