Ad esempio, utilizzo la funzione printf
in C++ per CPU 8-bit (AVR). È il seguente codice di sicurezza:Quali promozioni predefinite di tipi ci sono nella lista degli argomenti variadici?
uint8_t a = 5;
printf("%d", a);
Qui %d
aspetta int
(a 16 bit nel mio caso, e almeno a 16 bit, in ogni caso), ma mi passa a 8-bit integer.
Gli standard C/C++ garantiscono che qualsiasi tipo con grado inferiore a int
promosso a int
?
La stessa domanda per float a
e %f
che si aspetta double
e altri tipi analoghi.
Sì, il codice è sicuro, per la ragione che hai indovinato. – Deduplicator
Scarica per intero l'ultimo standard di draff e leggi per conto tuo. Promozioni predefinite: numeri interi di rango < int >> int, float >> double, era così. – Deduplicator
@Deduplicator: Mi interessano solo le promozioni nelle funzioni variadiche. 'printf ("% d ", a)' non è lo stesso di 'print_int (a)' (dove 'print_int' si aspetta 'argomento int'), perché il compilatore non sa ** cosa ** si aspetta una funzione variadica in '...'. Guardo la bozza, ma non riesco a trovare una risposta alla mia domanda. –