2012-04-09 26 views
7

¿Cómo puedo escribir (si es posible ...) una función que toma un número desconocido de parámetros en C99 (el tipo de retorno es constante)?Función con un número desconocido de parámetros en C

+1

¿Se refiere a una función diferente? Me gusta 'printf'? ¿Has buscado ''? – Potatoswatter

+0

Obtenga un libro en C o busque cosas como esta en línea. –

+1

posible duplicado de [pasar la cantidad variable de argumentos] (http://stackoverflow.com/questions/3836272/passing-variable-number-of-arguments) – Potatoswatter

Respuesta

16

Sí puede hacerlo en C usando lo que se conoce como funciones variadic. Las funciones estándar printf() y scanf() hacen esto, por ejemplo.

Ponga las elipsis (tres puntos) como el último parámetro en el que desea que 'el número variable de parámetros sea.

Para acceder a los parámetros incluyen la cabecera <stdarg.h>:

#include <stdarg.h> 

Y entonces usted tiene un tipo especial va_list que le da la lista de argumentos pasados, y se puede utilizar los va_start, va_arg y va_end macros para iterar a través de la lista de argumentos.

Por ejemplo:

#include <stdarg.h> 

int myfunc(int count, ...) 
{ 
    va_list list; 
    int j = 0; 

    va_start(list, count); 
    for(j=0; j<count; j++) 
    { 
    printf("%d", va_arg(list, int)); 
    } 

    va_end(list); 

    return count; 
} 

Ejemplo llamada:

myfunc(4, -9, 12, 43, 217); 

un ejemplo completo se puede encontrar en Wikipedia.

El parámetro count en el ejemplo le dice a la función llamada cuántos argumentos se pasan. El printf() y el scanf() lo encuentran a través de la cadena de formato, pero también puede hacerlo un argumento simple count. Algunas veces, el código usa un valor centinela, como un entero negativo o un puntero nulo (ver execl() por ejemplo).

-1

El formato con el ejemplo existente:

int yourFunc (int abc, ...) { 
    //your code here 
} 
+0

Eso es solo un prototipo. –

+0

Eso ya no es solo un prototipo, pero no es una explicación completa de cómo trabajar con argumentos de longitud variable. –

Cuestiones relacionadas