Est le %zu spécificateur nécessaire pour printf?
Nous utilisons C89 sur une plate-forme intégrée. J'ai tenté d'imprimer un size_t
, mais il ne fonctionne pas:
#include <stdio.h>
int main(void) {
size_t n = 123;
printf("%zu\n",n);
return 0;
}
Au lieu de 123
, j'ai eu zu
.
D'autres spécificateurs de fonctionner correctement.
Si size_t
existe ne devrait pas zu
également être disponible en printf
?
Est-ce quelque chose que je dois contacter mon fournisseur de bibliothèque sur, ou est une bibliothèque de la mise en œuvre a permis à l'exclure?
- Le
z
préfixe a été ajouté en C99, je crois. - Ok. Il ne semble pas être annotés. en.cppreference.com/w/cpp/io/c/fprintf
- Pourquoi une référence C++ dire n'importe quoi sur un C standard?
- L'Homme a...
- Ici, un peu d'histoire
- Maintenant marqué sur cppreference
- La droite. Je voulais poster le C de référence.
Vous devez vous connecter pour publier un commentaire.
size_t
existait au moins depuis C89 mais respectifs spécificateur de format%zu
(en particulier le modificateur de longueurz
) a été ajouté à la norme que depuis C99.Donc, si vous ne pouvez pas utiliser C99 (ou C11) et avait pour imprimer
size_t
en C89, vous avez juste à revenir à d'autres types, tels que:unsigned long
était assez grande pour accueillir la plus grande valeur possible den
(indépendamment de savoir si elle était assez grande pour prendre en charge la totalité desize_t
). Il est cependant impossible de garantir quesize_t
ne sera pas plus grande queunsigned long
, et il n'y a pas de garantie quen
serait toujours visible dansunsigned long
. Je ne sais pas combien de fois que ce serait un problème [de nombreux programmes pourraient être exécutés dans différents problèmes si ils calculent la taille de sprintf tampons...printf("%llu\n", (unsigned long long)n);
, sauf si vous savez que la taille est petite, commesizeof(int)
dans ce cas, vous pouvez simplement écrireprintf("%u\n", (unsigned)n);
unsigned long
. Siunsigned long long
est disponible (C99), puis%zu
rédacteur de devis poursize_t
serait également disponible. Ainsi, il n'y a pas besoin de cast pourunsigned long long
ici à tous.Cela fonctionne bien. Dans mon système, c'est l'impression de la valeur attendue.
Vous pouvez obtenir l'erreur due au compilateur. Je suis l'aide de la GCC compilateur. Si vous disposez de cette seule et essayer d'obtenir à la sortie de la première mise à jour de la GCC et puis essayer. Il va travailler.
%zu
n'est pas en charge des anciennes versions de MinGW que l'utilisation de gcc en combinaison avec le système de Microsoft de la bibliothèque C, qui jusqu'à très récemment, n'a pas en charge la plupart des C99 extensions.