stdarg.h et char paraments

Voici mon code:

void a_simple_func_with_variable_argument(int, ...); void a_simple_func_with_variable_argument(int start, ...) { va_list pa; char ch; va_start(pa, start); while(ch = va_arg(pa, char)) { printf("%c, ", ch); } printf("End\n"); va_end(pa); } ... //call the func above in somewhere a_simple_func_with_variable_argument(1, 'a', 'b', 'c', '\0'); 

Il a échoué après avoir été compilé par gcc, que manque-t-il?

Vous devez faire attention avec char ; il est automatiquement promu int dans une fonction variadique. Vous devrez passer int tant que deuxième argument de va_arg .

Quand je comstack votre exemple (après avoir corrigé va_arg (pa, char)), le compilateur (gcc 4.6) me dit

ac: Dans la fonction ‘a_simple_func_with_variable_argument’:
ac: 8: 14: avertissement: ‘char’ est promu en ‘int’ lorsqu’il est passé par ‘…’ [activé par défaut]
ac: 8: 14: note: (vous devriez donc passer ‘int’ pas ‘char’ à ‘va_arg’)
ac: 8: 14: note: si ce code est atteint, le programme sera annulé

Donc pas de surprise ici.

 int func(char a, char b, char c) /* DEMONSTRATION that char on stack is promoted to int !!! note: this promotion is NOT integer promotion of literals, but promotion during handling of the stack. don't confuse the two */ { const char *p = &a; printf("a=%d\n" "b=%d\n" "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this) } 

Le message est va_arg(ap, char) et va_arg(ap, short) est faux. Utilisez va_arg(ap, int) : il gérera les arguments de type int et de type “plus petit” (short, char).

Voir aussi http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html Quote: “Faites attention ici pour éviter les problèmes pouvant être causés par des conversions arithmétiques. Utilisez car ou court comme second argument de va_arg invariablement une erreur: ces types promeuvent toujours un maximum de signé int ou unsigned int, et les conversions float en double. ”