Question

Je veux imprimer une variable de type size_t en C, mais il semble que size_t est aliasé à différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits) le code suivant ne jette pas d'avertissement:

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

mais mon autre machine (32 bits), le code ci-dessus produit le message d'avertissement suivant:

  

avertissement: format '% ld' attend de type   'Long int *', mais l'argument est de type 3   'Size_t *'

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

Y at-il un spécificateur de format spécifique pour size_t?

Était-ce utile?

La solution

Oui: utiliser le modificateur de longueur de 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 qui sont 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.

Autres conseils

Oui, il y a. Il est %zu (comme spécifié dans la norme ANSI C99).

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

Notez que size_t est non signée, ainsi %ld est le double mal: mauvais modificateur de longueur et spécificateur de conversion de format incorrect. Dans le cas où vous vous demandez, %zd est pour ssize_t (qui est signé).

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

size_t size = 10;
printf("size is %Iu", size);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top