web-dev-qa-db-fra.com

Indépendant de la plateforme size_t Spécificateurs de format en c?

Je souhaite imprimer une variable de type size_t en C mais il semble que size_t est lié à 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 machine (32 bits), le code ci-dessus produit le message d'avertissement suivant:

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

Je soupçonne que cela est dû à la différence de taille du pointeur, de sorte que sur ma machine 64 bits size_t est associé à un long int ("%ld"), alors que sur ma machine 32 bits size_t est lié à un autre type.

Existe-t-il un spécificateur de format spécifiquement pour size_t?

74
Ethan Heilman

Oui: utilisez le modificateur de longueur z:

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

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

108
Adam Rosenfield

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. Si vous vous demandez, %zd est pour ssize_t (qui est signé).

39
maxschlepzig

MSDN , indique 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);
1
Arkantos