¿Cuáles son las promociones de tipo automático de los argumentos de función variadic?

Considere el siguiente fragmento de código:

#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; } 

El progtwig da un error de tiempo de ejecución porque vararg promueve automáticamente char to int, y debería haber usado int en este caso.

¿Qué son todos los tipos permitidos cuando uso vararg, cómo saber qué tipo usar y evitar tales errores de tiempo de ejecución?

Otro caso que los otros olvidaron mencionar son tipos de punteros, el crítico es NULL en particular. Como esto podría expandirse a 0 o (void*)0 (o algunas otras cosas extrañas), no sabrá si el comstackdor coloca un int o un void* en la lista. Ya que estos pueden tener diferentes anchos, esto puede llevar a errores molestos.

Puede usar cualquier tipo estándar con va_arg excepto char , char signed char , unsigned char , short , unsigned short , _Bool y float . Es posible que una implementación defina tipos adicionales no estándar que también tengan un rango de conversión de enteros más bajo que int , o también tipos pequeños de punto flotante no estándar, pero no sería necesario conocerlos a menos que tenga la intención de usarlos, por lo que, a efectos prácticos, La lista que di está completa.

Durante el uso de va_arg, el char se promueve a int . Hay otros tipos (la lista dada por @R ..) que se promueven.

así que para leerlo como un personaje debe hacer un encasillado.

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

para el ejemplo completo por favor vea:

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