varargs parametros parameter indefinidos argumentos c++ variadic-functions

c++ - parametros - varargs java



¿Es posible escribir una función varargs que le envíe la lista de argumentos a otra función varargs? (5)

No en el estándar C ++.

Posible duplicado:
Programación en C: Reenviar lista de argumentos variable.

Lo que me gustaría hacer es enviar datos a una biblioteca de registro (que no puedo modificar) de forma imprimible

Así que me gustaría una función como esta:

void log_DEBUG(const char* fmt, ...) { char buff[SOME_PROPER_LENGTH]; sprintf(buff, fmt, <varargs>); log(DEBUG, buff); }

¿Puedo pasar varargs a otra función vararg de alguna manera?


No puede reenviar la lista de argumentos variables, ya que no hay manera de expresar qué hay debajo de ... como parámetro (s) a otra función.

Sin embargo, puede crear una va_list partir de los ... parámetros y enviarla a una función que la formatee correctamente. Esto es para lo que es vsprintf . Ejemplo:

void log_DEBUG(const char* fmt, ...) { char buff[SOME_PROPER_LENGTH]; va_list args; va_start(args, fmt); vsprintf(buff, fmt, args); va_end(args); log(DEBUG, buff); }


Para su requerimiento específico, puede usar vsprintf . Mi C / C ++ está demasiado oxidado para recordar si hay una forma sencilla de hacerlo cuando la otra función no está diseñada para ello (sin meterme en la manipulación de la pila), pero tiendo a pensar que no.


Por eso tienes la familia de funciones vprintf .


Puede enviarlo a otra función que tome un va_list como argumento. No hay otra manera, aparte de recurrir al asm hecho a mano, o hacer algún tipo de juego de adivinanzas horripilante para averiguar el ''número'' de parámetros.

Esto funcionaría:

void log_DEBUG(const char* fmt, ...) { va_list va; va_start(va,fmt); char buff[blah]; vsprintf(buff,fmt,va); log(DEBUG,buff); va_end(va); }

Básicamente, cada vez que escribe una función que requiere ..., debe escribir otra versión que tome una lista_de_vista: es lo correcto si desea habilitar este tipo de llamada en cadena.