Plate-forme indépendante size_t Spécificateurs de format dans c?

Je souhaite imprimer une variable de type size_t en C, mais il semble que size_t soit size_t à différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits), le code suivant ne lance aucun avertissement:

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

mais sur mon autre ordinateur (32 bits), le code ci-dessus génère le message d’avertissement suivant:

avertissement: format ‘% ld’ attend le type ‘long int *’, mais l’argument 3 a le type ‘size_t *’

J’imagine que cela est dû à la différence de taille du pointeur, de sorte que ma machine de size_t est size_t par un size_t long int ( "%ld" ), alors que sur ma machine 32 bits, size_t correspond à un autre type.

Existe-t-il un spécificateur de format spécifique à size_t ?

Oui: utilisez le modificateur de longueur 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 

Les autres modificateurs de longueur disponibles sont hh (pour char ), h (en short ), l (pour long ), ll (pour long long ), j (pour intmax_t ), t (pour ptrdiff_t ) et L (pour long double ). Voir le paragraphe 7.19.6.1 (7) de la norme C99.

Oui il y a. C’est %zu (comme spécifié dans ANSI C99).

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

Notez que size_t n’est pas signé, donc %ld est double faux: mauvais modificateur de longueur et mauvais spécificateur de conversion de format. Au cas où vous vous %zd question, %zd est pour ssize_t (qui est signé).

MSDN dit que Visual Studio prend en charge le préfixe “I” pour le code portable sur les plates-formes 32 et 64 bits.

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