Necesitas usar size
en lugar de fmt
:
va_start(args, size);
Es size
, no fmt
, ese es el último parámetro que tiene un nombre explícito (a diferencia de los parámetros vararg, que no tienen nombres). Debe pasar el último parámetro nombrado a va_start
para que pueda averiguar la dirección en la memoria en la que comienzan los parámetros vararg.
second parameter of ‘va_start’ not last named argument
¿Qué significa y cómo eliminarlo?
Su función tiene parámetros con nombre parent
, fmt
y size
. La especificación C dice que siempre debe pasar el último parámetro nombrado a va_start
, para compatibilidad con compiladores más antiguos. Entonces debes pasar size
, no fmt
.
(Pero con un compilador moderno, podría funcionar de todos modos)
Creo que aquí hay una confusión:la mayoría de las personas solo se ocupan de funciones similares a las de impresión que tienen formato y varargs. y creen que tienen que pasar el nombre del parámetro que describe el formato. sin embargo, va_start no tiene nada que ver con ningún tipo de formato similar a printf. esta es solo una función que calcula el desplazamiento en la pila donde comienzan los parámetros sin nombre.