What default promotions of types are there in the variadic arguments list?
For example, I use printf
function in C++ for 8-bit CPU (AVR). Is the following code safe:
uint8_t a = 5;
printf("%d", a);
Here %d
expects int
(16-bit in my case, and at least 16-bit in any case), but I pass 8-bit integer.
Does C/C++ standards guarantee that any type with rank lesser than int
promoted to int
?
The same question for float a
and %f
that expects double
, and other analogous types.
Solution 1:
Look in the draft n1256 (C99 with Technical corrigenda TC1, TC2, and TC3 included) for 6.5.2.2 Function calls
:
For functions without prototype, or parameters corresponding to the ellipsis ...
, the default argument promotions are performed.
Those are: Default integer promotions and promotion of float
to double
.
Default integer promotions: Every integer type of rank less than int
is promoted to int
or unsigned int
.