Spécificateur de format correct printf pour la taille t: %zu ou %Iu?

je veux imprimer la valeur d'une variable size_t en utilisant printf en c/" class="blnk">C++ en utilisant Microsoft Visual Studio 2010 (je veux utiliser printf au lieu de << dans ce morceau de code spécifique, donc s'il vous plaît pas de réponses me disant que je devrais utiliser << à la place).

selon le post

spécificateurs de Format size_t indépendants de la plateforme en c?

la bonne façon d'utiliser %zu est indépendante de la plate-forme , mais cela ne semble pas fonctionner dans Visual Studio. La documentation de Visual Studio au

http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

me dit que je dois utiliser %Iu (en majuscules i , pas en minuscules l ).

est Microsoft ne suit pas le les normes ici? Ou a la norme changé depuis C99? Ou la norme est-elle différente entre C et c++ (ce qui me semble très étrange)?

32
demandé sur Community 2013-03-25 11:53:51

4 réponses

MS Visual Studio ne prend pas en charge %zu printf spécificateur avant VS2013 . À partir de VS2013 (e.g. _MSC_VER >= 1800 ) %zu est disponible.

comme alternative, pour les versions précédentes de Visual Studio si vous imprimez de petites valeurs (comme le nombre d'éléments des conteneurs std), Vous pouvez simplement mouler dans un int et utiliser %d :

printf("count: %d\n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u\n", (unsigned)str.size());
6
répondu Pavel 2018-06-25 21:54:10

à Partir de La documentation de microsoft

les préfixes de longueur hh, j, z et t ne sont pas supportés.

il indique que le préfixe correct à utiliser pour size_t est I-donc vous devez utiliser %Iu

16
répondu Orion Edwards 2013-12-11 20:21:59

le compilateur C de Microsoft ne rattrape pas les dernières normes C. Il s'agit essentiellement d'un compilateur C89 avec quelques fonctionnalités de C99 (par exemple long long ). Il n'est donc pas surprenant que quelque chose ne soit pas supporté ( %zu est apparu en C99).

15
répondu Alexey Frunze 2013-03-25 07:57:56

basé sur la réponse de ici , %z est un ajout C99. Puisque MSVC ne supporte aucune des dernières normes C, il n'est pas surprenant que %z ne soit pas supporté.

5
répondu Yuushi 2017-05-23 12:18:21