Macro de biblioteca C -va_end()
Biblioteca estándar de C - <stdarg.h>
va_endes una macro de la biblioteca estándar de C<stdarg.h>incluida en el archivo de encabezado, utilizada para limpiar la variableva_listy hacer que ya no apunte a ninguna ubicación de memoria válida. Se utiliza al final de una función de argumentos variables para finalizar el procesamiento de los argumentos variables.
Macro de biblioteca Cvoid va_end(va_list ap)permite que la función con argumentos variables que usó la macrova_startregrese. Si no se llama ava_endantes de regresar de la función, el resultado es indefinido.
Declaración
A continuación se muestra la declaración de la macro va_end().
void va_end(va_list ap);
Parámetros
va_list ap: esta es una variable de tipova_list, que ha sido inicializada por la macrova_startova_copy, para acceder a la lista de argumentos variables.
Valor de retorno
Esta macro no devuelve ningún valor.
Pasos de uso
- En una función de argumentos variables, use la macro
va_startpara inicializar la variableva_list. - Use la macro
va_argpara obtener secuencialmente cada argumento variable. - Después de procesar todos los argumentos variables, use la macro
va_endpara limpiar la variableva_list.
Ejemplo
El siguiente es un programa de ejemplo que usa la macrova_end. Este programa define una función de argumentos variables para calcular la suma de un número variable de parámetros:
Ejemplo
#include <stdarg.h>
// Función de argumentos variables, calcula la suma de los argumentos
int sum(int count, ...) {
int total = 0;
va_list args;
// Inicializa args para acceder a los argumentos variables
va_start(args, count);
// Obtiene cada argumento variable uno por uno y lo acumula en total
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
// Limpia args
va_end(args);
return total;
}
int main() {
printf("Sum of 1, 2, 3: %d\n", sum(3, 1, 2, 3)); // Salida: 6
printf("Sum of 4, 5, 6, 7: %d\n", sum(4, 4, 5, 6, 7)); // Salida: 22
return 0;
}
Compilemos y ejecutemos el programa anterior, lo que producirá el siguiente resultado:
Sum of 1, 2, 3: 6 Sum of 4, 5, 6, 7: 22
Análisis
va_list args;: declara una variable de tipova_list, utilizada paraargsalmacenar la información de la lista de argumentos variables.va_start(args, count);: inicializaargspara acceder a los argumentos variables que comienzan después decount.total += va_arg(args, int);: usa la macrova_argpara obtener el siguiente argumento variable, aquí se asume que todos son de tipoint, y los acumula en la variabletotal.va_end(args);: limpia la variableargs, para liberar recursos y evitar comportamiento indefinido.
Precauciones
- Cada vez que se utiliza la macro
va_startpara inicializar la variableva_list, se debe utilizar la macrova_endpara limpiarla. va_endse utiliza para limpiar la variableva_list, para liberar cualquier recurso antes de que la función regrese y evitar posibles problemas de memoria.- Después de llamar a
va_end, la variableva_listya no será válida y no debe utilizarse nuevamente.