59

Desidero stampare una variabile di tipo size_t in C ma sembra che l'opzione size_t sia associata a diversi tipi di variabile su diverse architetture. Ad esempio, su una macchina (a 64 bit), il seguente codice non genera nessun avvertimento:Platform independent size_t Formato specificatori in c?

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:

avvertimento: formato '% ld' si aspetta digitare 'long int *', ma l'argomento 3 è di tipo 'size_t *'

ho il sospetto che questo è dovuto alla differenza di dimensioni del puntatore, in modo che il mio Macchina a 64 bit size_t ha un alias su un long int ("%ld"), mentre sul mio computer a 32 bit size_t è sottoposto a alias in un altro tipo.

Esiste uno specificatore di formato specifico per size_t?

+0

Il messaggio di avviso non corrisponde al codice. L'avvertimento indica i puntatori, il tuo codice non ne ha. Hai rimosso alcuni '&' da qualche parte? – Jens

+0

Puntatori? No, non ricevo alcun avvertimento sui puntatori, infatti a seconda del computer su cui eseguo quel codice a volte non ricevo alcun avviso. Prova il seguente codice di prova: #include int main() { size_t size = 1; printf ("la dimensione è% ld", dimensione); return 0; } –

+1

Vedere anche [Stringa di formato cross platform per variabili di tipo size_t?] (Http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) . – legoscia

risposta

87

Sì: utilizzare il z lunghezza del modificatore:

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
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). Vedi §7.19.6.1 (7) dello standard C99.

+0

qual è la differenza tra zd e zu? Ho capito che zd è decimale, ma è firmato, in tal caso, come fa a firmare zd le cose. –

+1

È la differenza tra un 'size_t' e un' ssize_t'; quest'ultimo è usato raramente. –

+20

Esatto, quindi in questo caso dovresti usare '% zu', perché l'argomento non è firmato. – caf

25

Sì, c'è. È %zu (come specificato in ANSI C99).

size_t size = 1; 
printf("the size is %zu", size); 

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).

0

MSDN, afferma che Visual Studio supporta il prefisso "I" per il codice portatile su piattaforme a 32 e 64 bit.

size_t size = 10; 
printf("size is %Iu", size); 
+3

è specifico per MS, che non è conforme allo standard, quindi non è indipendente dalla piattaforma –