Nieprawidłowe przekazywanie uint_64_t do va_list

Jan 05 2021

Piszę funkcję niestandardową printfi uint64_twydaje 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 printfimplementacji, która daje niepoprawny wynik:

format++;
uint64_t num = va_arg(parameters, uint64_t);

Podczas debugowania za pomocą gdb wartość numstaje się 0xffffffffff00ffb7raczej niż 0xff00ffb7oczekiwana, a dla następnego %C numwynosi 0. Czy brakuje mi jakiegoś standardowego zachowania, czy robię coś źle?

Odpowiedzi

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Jeśli 0xff00ffb7ma być a uint64_tdla 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 longlub unsigned long long,: pierwsza z nich „pasuje”. Z 32-bitowym int/unsigned, 0xff00ffb7będzie unsignedi prawdopodobnie źródłem kłopotów OP.

Dołączanie udo stałej jest dobrym pomysłem, aby upewnić się, że jest to jakiś typ bez znaku.

Dołączanie Llub LLdo stałej nie jest dobrym pomysłem, aby zapewnić stałą jest uint64_t. Oba mogą pasować ( LLczęsto będą), ale te sufiksy nie gwarantują tego typu.

Użycie UINT64_C(0xff00ffb7)tworzy stałą typu, uint_least64_tktóra jest z pewnością taka sama jak uint64_tna maszynach, które mają uint64_t.