2014-04-03 23 views
9

Na przykład używam funkcji printf w C++ dla 8-bitowego procesora (AVR). Kod jest następujący bezpieczne:Jakie domyślne promocje typów znajdują się na liście argumentów variadic?

uint8_t a = 5; 
printf("%d", a); 

Tutaj %d spodziewa int (16-bit w moim przypadku, i co najmniej 16-bit w każdym razie), ale przechodzą 8-bitową liczbę całkowitą.

Czy standardy C/C++ gwarantują, że każdy typ o wartości mniejszej niż int będzie promowany na int?

To samo pytanie dla float a i %f, które oczekuje double i innych podobnych typów.

+0

Tak, kod jest bezpieczny z tego powodu, dla którego zgadłeś. – Deduplicator

+0

Najlepiej pobierz najnowszy standard droidów i czytaj sam. Domyślne promocje: liczby całkowite w rankingu < int >> int, float >> double, to było to. – Deduplicator

+0

@Deduplicator: Interesują mnie tylko promocje w funkcjach variadic. 'printf ("% d ", a)' to nie to samo, co 'print_int (a)' (gdzie 'print_int' oczekuje argumentu' int'), ponieważ kompilator nie wie ** co ** oczekuje funkcja wariancji w '...'. Patrzę na wersję roboczą, ale nie mogę znaleźć odpowiedzi na moje pytanie. –

Odpowiedz

13

Look w projekcie n1256 (C99 with Technical corrigenda TC1, TC2, and TC3 included) dla 6.5.2.2 Function calls:

Dla funkcji bez prototypu lub parametrów odpowiadających elipsy ..., że promocje są wykonywane domyślne argumentów.

Są to: Domyślne promocje całkowite i promocja float do double.

promocje Domyślnie całkowitymi: Każdy rodzaj całkowitą rangi mniej niż int jest promowany do int lub unsigned int.

Powiązane problemy