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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top