Programación en C: lista de argumentos de variables hacia adelante

2 minutos de lectura

avatar de usuario
Josué mejilla

Estoy tratando de escribir una función que acepte una cantidad variable de parámetros como printf, haga algunas cosas y luego pase la lista de variables a printf. No estoy seguro de cómo hacer esto, porque parece que tendría que empujarlos a la pila.

Algo así aproximadamente

http://pastie.org/694844

#include <stdio.h>
#include <stdarg.h>

void forward_args( const char *format , ... ){
  va_list arglist;
  printf( format, arglist );
}


int main (int argc, char const *argv[]){
  forward_args( "%s %s\n" , "hello" , "world" );  return 0;
}

¿Algunas ideas?

  • ¿Tal vez tú y John están en la misma clase? stackoverflow.com/questions/1714550/…

    –Mark Rushakoff

    12 de noviembre de 2009 a las 4:00

  • posible duplicado de Reenviar una invocación de una función variádica en C

    – dmckee — gatito ex-moderador

    28 de marzo de 2013 a las 15:33

avatar de usuario
cuarc

No pases los resultados a printf. pasarlos a vprintf. vprintf existe específicamente para manejar el paso en va_list argumentos Desde la página del manual de Linux:

#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

Observe cómo estos últimos toman explícitamente va_list argumentos como los que declara dentro de una función que toma ... en la lista de parámetros. Entonces su función se declararía así:

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}

  • Bueno, él necesita va_start() y va_end() además.

    –Ken Bloom

    12 de noviembre de 2009 a las 4:36

  • @Ken Bloom: Uf. Creí haber arreglado eso. Moraleja: no escribas código cansado, incluso el código que solo estás cortando y pegando. Gracias por captar eso.

    – quark

    12 de noviembre de 2009 a las 16:12

  • Hola, Ken, vi tu nombre y tuve que pensar durante unos 15 minutos para averiguar de dónde lo reconocí… Te he visto en la lista de correo de Ruby ^_^ Gracias por la ayuda, tanto Ken como Quark.

    – Josué Mejilla

    14 de noviembre de 2009 a las 1:12

avatar de usuario
mensaje de tim

Estoy bastante seguro de que estás buscando va_start() / vprintf() / vsnprintf() / va_end()no hay necesidad de implementarlos usted mismo.

Pasará el valor de la lista de argumentos a una función diseñada para consumirlo. Consulte la documentación de stdarg y vprintf para obtener más pistas.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad