Piattaforma prescrittori size_t formato indipendenti in C?
-
22-09-2019 - |
Domanda
Voglio stampare una variabile di tipo size_t
in C ma sembra che size_t
è alias a diversi tipi di variabili su differenti architetture. Ad esempio, su una macchina (a 64 bit), il seguente codice non genera eventuali avvisi:
size_t size = 1;
printf("the size is %ld", size);
, ma sulla mia altra macchina (32-bit) il codice precedente produce il seguente messaggio di avviso:
Attenzione: formato '% ld' si aspetta digitare 'Long int *', ma l'argomento è di tipo 3 'Size_t *'
Ho il sospetto che questo è dovuto alla differenza di dimensioni del puntatore, in modo che sulla mia macchina size_t
a 64-bit è alias a un long int
("%ld"
), mentre sulla mia macchina size_t
a 32 bit è alias a un altro tipo.
C'è un identificatore di formato appositamente per size_t
?
Soluzione
Sì: utilizzare la lunghezza z
modificatore:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
Gli altri modificatori di lunghezza che sono disponibili sono hh
(per char
), h
(per short
), l
(per long
), ll
(per long long
), j
(per intmax_t
), t
(per ptrdiff_t
), e L
( per long double
). Vedere §7.19.6.1 (7) dello standard C99.
Altri suggerimenti
Sì, c'è. E '%zu
(come specificato in ANSI C99).
size_t size = 1;
printf("the size is %zu", size);
Si noti che size_t
non è firmato, quindi %ld
è doppio sbagliato: modificatore di lunghezza sbagliata e sbagliato specificatore di conversione di formato. Nel caso in cui ti chiedi, %zd
è per ssize_t
(che è firmato).
MSDN , afferma che Visual Studio supporta l ' "io" prefix per portatile codice su piattaforme 32 e 64 bit.
size_t size = 10;
printf("size is %Iu", size);