Namespaces
Variants

va_start

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades del programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación tripartita
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
Funciones de comparación de enteros
(C++20)(C++20)(C++20)    
(C++20)
Operaciones de intercambio y tipo
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Tipos de vocabulario comunes
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Definido en el encabezado <cstdarg>
void va_start( std::va_list ap, parmN );
(hasta C++26)
void va_start( std::va_list ap, ... );
(desde C++26)

La macro va_start habilita el acceso a los argumentos variablesque siguen al argumento con nombre parmN(hasta C++26).

va_startdebe invocarse con una instancia de un objeto std::va_list válido ap antes de cualquier llamada a va_arg.

Si parm_n es una expansión de paquete o una entidad resultante de una captura lambda, el programa está mal formado, no se requiere diagnóstico.

(desde C++11)

Si parm_n es de tipo referencia, o de un tipo no compatible con el tipo que resulta de las promociones de argumentos por defecto, el comportamiento no está definido.

(hasta C++26)

Si hay más de un argumento presente para va_start, los tokens de preprocesamiento que comprenden el segundo y los argumentos subsiguientes se descartan. Si alguno de esos argumentos se expande para incluir paréntesis no balanceados, o un token de preprocesamiento que no se convierte en un token, el programa está mal formado, no se requiere diagnóstico.

(desde C++26)

Parámetros

ap - un objeto del tipo va_list
parm_n - el parámetro nombrado que precede al primer parámetro variable

Valor expandido

(ninguno)

Notas

va_start es necesario para soportar parm_n con el operador operator& sobrecargado.

Ejemplo

#include <cstdarg>
#include <iostream>
int add_nums(int count...)
{
    int result = 0;
    std::va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    va_end(args);
    return result;
}
int main()
{
    std::cout << add_nums(4, 25, 25, 50, 50) << '\n';
}

Salida:

150

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
CWG 273 C++98 no estaba claro si va_start debe
soportar parm_n s con operator& sobrecargado
requerido
LWG 2099 C++98 el comportamiento era indefinido si parm_n se
declara con tipo función, array o referencia
el comportamiento es indefinido si
parm_n es de tipo referencia

Véase también

accede al siguiente argumento de función variádica
(macro de función)
finaliza el recorrido de los argumentos de función variádica
(macro de función)
Documentación de C para va_start