Namespaces
Variants

Variadic arguments

From cppreference.net

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