2011-01-10 5 views
6

aus irgendeinem Grund kann ich nicht diese Arbeit bekommen:Wie benutzt man String in va_start?

void examplefunctionname(string str, ...){ 
... 
    va_start(ap, str.c_str()); 

noch bekomme ich diese Arbeit:

void examplefunctionname(string str, ...){ 
... 
    int len = str.length(); 
    char *strlol = new char[len+1]; 
    for(int i = 0; i < len; i++){ 
     strlol[i] = str[i]; 
    } 
    strlol[len] = 0; 
    va_start(ap, strlol); 

aber dies tut:

void examplefunctionname(const char *str, ...){ 
... 
    va_start(ap, str); 

mir jemand zeigen könnte, wie ich kann String statt const char * dort verwenden?

seine Ausgabe von Zufallszahlen, wenn ich examplefunctionname("%d %d %d", 1337, 1337, 1337) nennen

+1

Warum verwenden Sie nicht 'va_start (ap, str)' in Ihren Beispielen, wo die Funktion eine 'Zeichenfolge' nimmt? Sie sollten den Namen des Parameters im Makro 'va_start' verwenden, nicht einen beliebigen Ausdruck. –

+0

oh verdammt, ich dachte, es liest eine Zeichenfolge dort, so dass es eine Adresse zu der Variablen ... und das verwendet, um die letzte Variable und dann Schleife zum nächsten? ah .. ich sehe es jetzt – Newbie

Antwort

5

Aus der Dokumentation:

va_start(va_list ap, last) ... Der Parameter last ist der Name des letzten Parameters vor der variablen Argumentliste, das heißt, der letzte Parameter, von denen die aufrufende Funktion des Typen kennt.

Sie haben das richtig in Ihrem Arbeitsbeispiel getan: va_start(ap, str) und str ist der letzte bekannte Argument. Aber in den anderen beiden Beispielen übergibst du seltsame Dinge an va_start.

0

va_start ein Makro, das das zweite Argument als Standort verwendet, müssen Sie deshalb das letzte Beispiel verwenden Sie geben.

1

va_start erfordert den vorherigen Parameter. Das bedeutet, dass Sie str unabhängig von seinem Typ direkt übergeben müssen. Es benötigt kein const char * und analysiert die Zeichenfolge nicht für Sie.

0
void examplefunctionname(string str, ...){ 
... 
va_start(ap, str);