c++ - lenguaje - Corrija el especificador de formato printf para size_t:% zu o% Iu?
printf(% d (4)
Quiero imprimir el valor de una variable size_t
usando printf
en C ++ usando Microsoft Visual Studio 2010 (quiero usar printf
lugar de <<
en este fragmento de código específico, así que por favor no me digan que debería usar <<
lugar) .
Según la publicación
la forma correcta de plataforma independiente es usar %zu
, pero esto no parece funcionar en Visual Studio. La documentación de Visual Studio en
http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx
me dice que debo usar %Iu
(usando mayúsculas i
, no minúsculas l
).
¿Microsoft no está siguiendo los estándares aquí? ¿O ha cambiado el estándar desde C99? ¿O es el estándar diferente entre C y C ++ (que me parece muy extraño)?
De http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx
Los prefijos de longitud hh, j, z y t no son compatibles.
Indica que el prefijo correcto para size_t
es I, por lo que usaría %Iu
El compilador de C de Microsoft no alcanza los últimos estándares de C. Básicamente es un compilador C89 con algunas características escogidas por C99 (por ejemplo, long long
). Por lo tanto, no debe sorprender que algo no sea compatible ( %zu
apareció en C99).
MS Visual Studio no VS2013
especificador %zu
printf antes de VS2013
. A partir de VS2013 (p _MSC_VER
Ej. _MSC_VER
> = 1800
) %zu
está disponible.
Como alternativa, para las versiones anteriores de Visual Studio, si está imprimiendo valores pequeños (como el número de elementos de los contenedores estándar), puede simplemente convertir a un int
y usar %d
:
printf("count: %d/n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u/n", (unsigned)str.size());
Según la respuesta de here , %z
es una adición de C99. Como MSVC no es compatible con ninguno de los estándares C posteriores, no sorprende que %z
no sea compatible.