Variadic arguments
Las funciones variádicas son funciones que pueden ser llamadas con diferente número de argumentos.
Solo las declaraciones de funciones prototipadas function declarations pueden ser variádicas. Esto se indica mediante el parámetro de la forma ... que debe aparecer último en la lista de parámetros y debe seguir al menos un parámetro nombrado (until C23) . El parámetro de elipsis y el parámetro precedente deben estar delimitados por , .
// Declaración prototipada int printx(const char* fmt, ...); // función declarada de esta manera printx("hello world"); // puede ser llamada con un printx("a=%d b=%d", a, b); // o más argumentos int printz(...); // Válido desde C23 y en C++ // Error hasta C23: ... debe seguir al menos un parámetro nombrado // int printy(..., const char* fmt); // Error: ... debe ser el último // int printa(const char* fmt...); // Error en C: se requiere ','; Válido en C++
En la llamada a función , cada argumento que forma parte de la lista de argumentos variables sufre conversiones implícitas especiales conocidas como promociones de argumentos predeterminadas .
Dentro del cuerpo de una función que utiliza argumentos variádicos, los valores de estos argumentos pueden accederse utilizando las
<stdarg.h>
facilidades de biblioteca
:
|
Definido en el encabezado
<stdarg.h>
|
|
|
habilita el acceso a los argumentos de función variádicos
(macro de función) |
|
|
accede al siguiente argumento de función variádico
(macro de función) |
|
|
(C99)
|
realiza una copia de los argumentos de función variádicos
(macro de función) |
|
finaliza el recorrido de los argumentos de función variádicos
(macro de función) |
|
|
contiene la información necesaria para
va_start
,
va_arg
,
va_end
, y
va_copy
(typedef) |
|
Contenidos |
Notas
Aunque las declaraciones de funciones al estilo antiguo (sin prototipo)
function declarations
permiten que las llamadas posteriores a funciones utilicen cualquier número de argumentos, no se permite que sean variádicas (desde C89). La definición de dicha función debe especificar un número fijo de parámetros y no puede utilizar las macros de
stdarg.h
.
// declaración de estilo antiguo, eliminada en C23 int printx(); // función declarada de esta manera printx("hello world"); // puede ser llamada con un printx("a=%d b=%d", a, b); // o más argumentos // el comportamiento de al menos una de estas llamadas es indefinido, dependiendo de // el número de parámetros que la función está definida para tomar
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("logging %d %d %d...\n", 1, 2, 3); }
Salida:
[10:21:38] logging 1 2 3...
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 6.7.6.3/9 Declaradores de función (incluyendo prototipos) (p: 96)
-
- 7.16 Argumentos variables <stdarg.h> (p: 197-199)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.7.6.3/9 Declaradores de función (incluyendo prototipos) (p: 133)
-
- 7.16 Argumentos variables <stdarg.h> (p: 269-272)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 6.7.5.3/9 Declaradores de función (incluyendo prototipos) (p: 119)
-
- 7.15 Argumentos variables <stdarg.h> (p: 249-252)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 3.5.4.3/5 Declaradores de función (incluyendo prototipos)
-
- 4.8 ARGUMENTOS VARIABLES <stdarg.h>
Véase también
|
Documentación de C++
para
Variadic arguments
|