2010-12-30 18 views
5

Quiero definir una función en lenguaje C que puede tomar un número ilimitado de argumentos de cualquier tipo de datos. Por ejemplo: printf(), scanf(), etc.Función en C con argumentos ilimitados?

¿Alguna idea de esto?

+7

* Nota: Probablemente es mejor evitarlo siempre que sea posible ... –

+0

no puede escribir una función que puede tomar un número "ilimitado" de argumentos. Siempre hay un límite superior. Lo que probablemente quiso decir es, número de argumentos "variables". – Nawaz

Respuesta

8

Para utilizar un número variable de argumentos en C que necesita para incluir la cabecera

#include <stdarg.h> 

printf() en C es un ejemplo de función que toma un número variable de argumentos.

int printf(const char *fmt, ...) 

Más información here

+0

¿Cómo podemos acceder a los argumentos en orden aleatorio? El enlace nos muestra solo la forma de acceder a ellos secuencialmente. –

2
void printf(char* format, ...) 
{ 
} 

Mirar hacia arriba Variadic Functions y varargs.h o stdarg.h (dependiendo del compilador).

+5

No debe haber ningún compilador todavía en uso que todavía requiera ''; todos los compiladores modernos (es decir, de menos de 10 años de antigüedad) admiten '' y el código nuevo solo debe usar eso. Tenga en cuenta que algunos compiladores ya no admiten ''; Creo que me encontré con esto en HP-UX (por accidente). –

1

Consulte el encabezado <stdarg.h> y la documentación relacionada.

5

declara la función como tomar un último argumento .... Tendrá que usar las macros de <stdarg.h> para acceder a los argumentos como va_list.

Si lo que desea es algo "como printf, pero con un comportamiento un poco extra", entonces puede pasar de la va_list-vprintf, vfprintf o vsprintf.

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

#ifdef __GNUC__ 
    __attribute__((format(printf, 1, 2))) 
#endif 
void PrintErrorMsg(const char* fmt, ...) 
{ 
    time_t  now; 
    char  buffer[20]; 
    va_list args; 

    va_start(args, fmt); 
    time(&now); 
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", gmtime(&now)); 
    fprintf(stderr, "[%s] ", buffer); 
    vfprintf(stderr, fmt, args); 
    fputc('\n', stderr); 
    va_end(args); 
} 
Cuestiones relacionadas