Argumentos variadicos
Las funciones variádicas son funciones que pueden ser llamadas con un número variable de argumentos.
Sólo los nuevos estilos (prototipos) de declaración de funciones pueden ser variádicos. Esto se indica mediante el parámetro de forma ... que debe aparecer en último lugar en la lista de parámetros y debe preceder al menos un parámetro con nombre.
//Declaración de nuevo estilo int printx(const char* fmt, ...); // función declarada de esta manera printx("hello world"); // puede ser llamada con uno printx("a=%d b=%d", a, b); // o mas argumentos // int printy(..., const char* fmt); // Error: ... debe ser el último // int printz(...); // Error: ... debe ser precedido por lo menos por un parámetro con nombre
En la llamada de función, cada argumento que forma parte de la lista de argumentos variables sufre conversiones implícitas especiales conocidas como promociones de argumentos por defecto.
Dentro del cuerpo de una función que utiliza argumentos variádicos, se puede acceder a los valores de estos argumentos utilizando las facilidades de la biblioteca <stdarg.h>:
Definido en el archivo de encabezado
<stdarg.h> | |
permite el acceso a argumentos de funciones variádicas (macro de función) | |
accede al siguiente argumento de función variádica (macro de función) | |
(C99) |
hace una copia de los argumentos de las funciones variádicas (macro de función) |
finaliza la transferencia de los argumentos de la función variádica (macro de función) | |
contiene la información necesaria para va_start, va_arg, va_end y va_copy (typedef) |
Contenido |
[editar] Observaciones
Aunque las antiguas (sin prototipo) declaración de funcionespermiten que las siguientes llamadas de función utilicen cualquier número de argumentos, no se permite que sean variadas (a partir de C89). La definición de dicha función debe especificar un número fijo de parámetros y no puede utilizar las macros stdarg.h
.
// declaración antigua int printx(); // función declarada de esta manera printx("hello world"); // puede ser llamada con uno printx("a=%d b=%d", a, b); // o mas argumentos // el comportamiento de al menos una de estas llamadas es indefinido, dependiendo de // el número de parámetros para los que se define la función
[editar] Ejemplo
#include <stdio.h> #include <time.h> #include <stdarg.h> void tlog(const char* fmt,...) { char msg[50]; strftime(msg, sizeof msg, "%T", localtime(&(time_t){time(NULL)})); printf("[%s] ", msg); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } int main(void) { tlog("guardando el archivo de registro %d %d %d...\n", 1, 2, 3); }
Salida:
[10:21:38] guardando el archivo de registro 1 2 3...
[editar] Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 6.7.6.3/9 Function declarators (including prototypes) (p: 133)
- 7.16 Variable arguments <stdarg.h> (p: 269-272)
- Standard C99 (ISO/IEC 9899:1999):
- 6.7.5.3/9 Function declarators (including prototypes) (p: 119)
- 7.15 Variable arguments <stdarg.h> (p: 249-252)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 3.5.4.3/5 Function declarators (including prototypes)
- 4.8 VARIABLE ARGUMENTS <stdarg.h>
[editar] Véase también
Documentación de C++ para Argumentos variadicos
|