Quelles sont les promotions de type automatiques des arguments de fonction variadic?

Considérez l’extrait de code suivant:

#include  #include  void display(int num, ...) { char c; int j; va_list ptr; va_start(ptr,num); for (j= 1; j <= num; j++){ c = va_arg(ptr, char); printf("%c", c); } va_end(ptr); } int main() { display(4, 'A', 'a', 'b', 'c'); return 0; } 

Le programme donne une erreur d’exécution car vararg promeut automatiquement char en int, et j’aurais dû utiliser int dans ce cas.

Quels sont tous les types autorisés lorsque j’utilise vararg, comment savoir quel type utiliser et comment éviter de telles erreurs d’exécution.

un autre cas que les autres ont oublié de mentionner sont des types de pointeur, critique étant NULL en particulier. Comme cela pourrait s’étendre à 0 ou (void*)0 (ou à d’autres choses étranges), vous ne saurez pas si le compilateur met un int ou un void* dans la liste. Comme ceux-ci peuvent avoir des largeurs différentes, cela peut conduire à des bugs ennuyeux.

Vous pouvez utiliser n’importe quel type standard avec va_arg exception des caractères char , va_arg , signed char , unsigned char , short , unsigned short , _Bool et float . Il est possible qu’une implémentation définisse des types non standard supplémentaires ayant également un rang de conversion entier inférieur à int , ou bien des types non standard de petite taille à virgule flottante. La liste que j’ai donnée est complète.

En utilisant va_arg, char est promu en int . Il existe d’autres types (la liste donnée par @R ..) qui sont promus.

donc pour le lire en tant que caractère, vous devez faire un typecast.

comme: c = (char) va_arg (ap, int);

pour l’exemple complet, voir:

http://en.cppreference.com/w/cpp/language/argaire_variadique