97 votes

Size_t indépendant de la plate-forme Spécificateurs de format en c?

Je veux imprimer une variable de type size_t en c, mais il semble que size_t est un alias de différents types de variables sur les différents architextures. Par exemple sur une machine (64-bit), le code suivant n'est pas de jeter des réchauffements:

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

mais sur mon autre machine (32_bit) le code ci-dessus génère le message d'avertissement suivant:

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

Je suppose que c'est dû au fait qu'il faut une machine 64 bits, et l'autre est en 32 bits, alors que sur ma machine 64 bits size_t est un alias pour un long int (%ld), alors que sur ma machine 32 bits size_t est un alias vers un autre type.

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

132voto

Adam Rosenfield Points 176408

Oui: utilisation de l' z modificateur de longueur:

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

48voto

maxschlepzig Points 3578

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 est non signé, donc %ld est double incorrect: modificateur de longueur incorrect et spécificateur de conversion de format incorrect. Au cas où vous vous le demanderiez, %zd est pour ssize_t (qui est signé).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X