Platform independent size_t Formato specificatori in c?

Voglio stampare una variabile di tipo size_t in C ma sembra che size_t sia alias a diversi tipi di variabili su diverse architetture. Ad esempio, su una macchina (64 bit) il seguente codice non genera alcun avviso:

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

ma sulla mia altra macchina (32 bit) il codice sopra riportato produce il seguente messaggio di avviso:

avviso: il formato ‘% ld’ prevede il tipo ‘long int *’, ma l’argomento 3 ha tipo ‘size_t *’

Sospetto che ciò sia dovuto alla differenza nella dimensione del puntatore, in modo che sulla mia macchina a 64 bit size_t sia con alias un long int ( "%ld" ), mentre sulla mia macchina a 32 bit size_t è alterato in un altro tipo.

Esiste un size_t formato specifico per size_t ?

Sì: usa il modificatore della lunghezza z :

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

Si C’è. È %zu (come specificato in ANSI C99).

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

Nota che size_t non è firmato, quindi %ld è doppio sbagliato: modificatore di lunghezza errato e identificatore di conversione del formato errato. Nel caso in cui ti chiedi, %zd è per ssize_t (che è firmato).

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

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