2011-01-10 4 views
6

por alguna razón, no puedo conseguir este trabajo:cómo usar una cadena en va_start?

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

ni puedo obtener este trabajo:

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); 

pero esto:

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

es posible que alguien me muestran cómo i puede usar una cadena en lugar de const char * allí?

su salida números aleatorios cuando llamo examplefunctionname("%d %d %d", 1337, 1337, 1337)

+1

¿Por qué no estás usando 'va_start (ap, str)' en tus ejemplos donde la función toma 'string'? Se supone que debes usar el nombre del parámetro en la macro 'va_start', no una expresión arbitraria. –

+0

oh, maldición, pensé que se lee una cadena ahí, por lo que se necesita una dirección para la variable ... ¿y la usa para conocer la última variable y luego pasar al siguiente? ah ... lo veo ahora – Newbie

Respuesta

5

De la documentación:

va_start(va_list ap, last) ... El parámetro last es el nombre del último parámetro antes de la lista de argumentos variable, es decir, el último parámetro de la cual la función de llamada conoce el tipo.

que haya hecho esto correctamente en el ejemplo de trabajo: va_start(ap, str) y str es el último argumento conocida. Pero en los otros dos ejemplos, estás pasando cosas raras al va_start.

0

va_start es una macro que utiliza el segundo argumento como una ubicación, por lo tanto, necesidad de utilizar el último ejemplo que das.

1

va_start requiere el parámetro anterior. Eso significa que tienes que pasar str directamente, independientemente de su tipo. No requiere un const char * y no analiza la cadena por ti.

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