Nieprawidłowe przekazywanie uint_64_t do va_list
Piszę funkcję niestandardową printf
i uint64_t
wydaje się, że jest ona niepoprawnie przekazywana do va_list
:
Problematyczny punkt:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Część mojej printf
implementacji, która daje niepoprawny wynik:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Podczas debugowania za pomocą gdb wartość num
staje się 0xffffffffff00ffb7
raczej niż 0xff00ffb7
oczekiwana, a dla następnego %C
num
wynosi 0. Czy brakuje mi jakiegoś standardowego zachowania, czy robię coś źle?
Odpowiedzi
Jeśli 0xff00ffb7
ma być a uint64_t
dla funkcji wariadycznej, rzuć ją.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, jako stała całkowita, ma typ int, unsigned, long, unsigned long, long long
lub unsigned long long
,: pierwsza z nich „pasuje”. Z 32-bitowym int/unsigned
, 0xff00ffb7
będzie unsigned
i prawdopodobnie źródłem kłopotów OP.
Dołączanie u
do stałej jest dobrym pomysłem, aby upewnić się, że jest to jakiś typ bez znaku.
Dołączanie L
lub LL
do stałej nie jest dobrym pomysłem, aby zapewnić stałą jest uint64_t
. Oba mogą pasować ( LL
często będą), ale te sufiksy nie gwarantują tego typu.
Użycie UINT64_C(0xff00ffb7)
tworzy stałą typu, uint_least64_t
która jest z pewnością taka sama jak uint64_t
na maszynach, które mają uint64_t
.