2010-11-29 13 views
5

Esto es lo que he intentado ... pero fracasó:¿Cómo usaría el operador `...` C para obtener una función para imprimir todos sus argumentos?

void testfunc(...){ 
    printf(...); 
} 
+0

posible duplicado de [Pasar argumentos variables a otra función que acepte una lista de argumentos variables] (http://stackoverflow.com/questions/3530771/ passing-variable-arguments-to-another-function-that-accepts-a-variable-argument-l) – Justin

+0

No estoy seguro de si el duplicado sugerido es realmente un duplicado exacto (en realidad no es tan claro lo que quieres para lograrlo aquí), sin embargo, en cualquier caso, es muy similar y debería ayudarte. – Justin

Respuesta

2

Debe utilizar va_start(), va_end(), va_arg() y (no siempre) va_list y debe tener argumento definido al menos una constante! Por ejemplo:

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

void PrintFloats (int amount, ...) 
{ 
    int i; 
    double val; 
    printf ("Floats passed: "); 
    va_list vl; 
    va_start(vl,amount); 
    for (i=0;i<amount;i++) 
    { 
    val=va_arg(vl,double); 
    printf ("\t%.2f",val); 
    } 
    va_end(vl); 
    printf ("\n"); 
} 

int main() 
{ 
    PrintFloats (3,3.14159,2.71828,1.41421); 
    return 0; 
} 
3

Esto creará una función que es equivalente a printf. Tenga en cuenta que no puede imprimir a ciegas los argumentos, ya que de alguna manera necesita saber qué tipo de cada argumento es de antemano. El argumento format para printf le informa qué argumentos esperar y qué tipos serán.

#include <stdargs.h> 

void testfunc(const char *format, ...) 
{ 
    va_list ap; 
    va_start(ap, format); 

    vprintf(format, ap); 

    va_end(ap); 
} 
1

Puede utilizar los va_start() y va_end() macros, pero usted tiene que tener al menos un argumento:

void testfunc(int n, ...) 
{ 
    va_list vl; 
    va_start(vl, n); // initialize the va_list 
    // something useful 
    va_end(vl); // deinitializes vl 
} 

Puede acceder a los argumentos secuencialmente con va_arg(vl, type) (por ejemplo int x = va_arg(vl, int)). Además, va_copy es de vez en cuando útil si desea copiar el estado actual de va_list

Cuestiones relacionadas