Vous devez utiliser size
au lieu de fmt
:
va_start(args, size);
Il est size
, pas fmt
, c'est-à-dire le dernier paramètre qui a un nom explicite (par opposition aux paramètres vararg, qui n'ont pas de nom). Vous devez passer le dernier paramètre nommé à va_start
afin qu'il puisse déterminer l'adresse en mémoire à laquelle les paramètres vararg commencent.
second parameter of ‘va_start’ not last named argument
Qu'est-ce que cela signifie et comment le supprimer ?
Votre fonction a des paramètres nommés parent
, fmt
et size
. La spécification C indique que vous devez toujours passer le dernier paramètre nommé à va_start
, pour la compatibilité avec les anciens compilateurs. Vous devez donc passer size
, pas fmt
.
(Mais avec un compilateur moderne, cela pourrait fonctionner quand même)
Je pense qu'il y a une confusion ici:la plupart des gens ne traitent que des fonctions de type prinf qui ont un format et des varargs. et ils pensent qu'ils doivent passer le nom du paramètre qui décrit le format. cependant, va_start n'a rien à voir avec tout type de format de type printf. c'est juste une fonction qui calcule le décalage sur la pile où commencent les paramètres sans nom.