¿Cuál es la forma correcta de usar printf para imprimir size_t?
size_t
se define como un unsigned
número entero, pero su tamaño depende de si estás en una máquina de 32 o 64 bits. ¿ Cuál es una forma correcta y portátil de imprimir un archivo size_t
?
Intente usar la %zu
cadena de formato
size_t val = get_the_value();
printf("%zu",val);
La porción z es un especificador de longitud que dice que el argumento tendrá una longitud de tamaño_t.
Fuente: http://en.wikipedia.org/wiki/Printf#printf_format_placeholders
Hay una etiqueta C++ en esto, al igual que cout <<
otra posible respuesta.
Esto es sorprendentemente difícil de hacer bien en todas las versiones de C. En C90, la conversión unsigned long
debería funcionar, pero es posible que no funcione en C99, y las soluciones de C99 no necesariamente funcionarán en C90. La capacidad de distinguir de manera confiable entre C90 y C99 se introdujo en los cambios de 1995 (especificando los valores permitidos para __STDC__
). No creo que exista una forma completamente portátil que funcione para C90, C99 y C++, aunque existen soluciones para cualquiera de ellos.
Creo que la respuesta de C++ es:
std::size_t n = 1;
std::cout << n;
Para IO estilo C es un poco más complicado. En C99 agregaron el z
modificador de longitud para size_t
los valores. Sin embargo, antes de TR1 esto no es compatible, por lo que solo tienes que convertir a un tamaño específico como:
std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));
Por otra parte, unsigned long long
C++ no es realmente compatible de todos modos, por lo que lo anterior funcionará bien ya que unsigned long
es el tipo integral legal más grande. Después de TR1 puedes usarlo %zu
de forma segura para size_t
los valores.