2014-04-03 7 views
9

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.

+0

Sì, il codice è sicuro, per la ragione che hai indovinato. – Deduplicator

+0

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

+0

@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. –

risposta

13

sguardo nel progetto di n1256 (C99 with Technical corrigenda TC1, TC2, and TC3 included) per 6.5.2.2 Function calls:

Per le funzioni senza prototipo, o parametri corrispondenti al puntini di sospensione ..., le promozioni di argomento di default vengono eseguite.

Questi sono: promozioni intere di numero predefinito e promozione di float a double.

Promozioni numeri interi predefiniti: ogni tipo intero di rango inferiore a int viene promosso a int o unsigned int.

Problemi correlati