¿Cuál es la forma correcta de usar printf para imprimir size_t?

Resuelto bradtgmurray asked hace 15 años • 3 respuestas

size_tse define como un unsignednú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?

bradtgmurray avatar Jun 02 '09 22:06 bradtgmurray
Aceptado

Intente usar la %zucadena 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

JaredPar avatar Jun 02 '2009 15:06 JaredPar

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 longdeberí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.

David Thornley avatar Jun 02 '2009 15:06 David Thornley

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 zmodificador de longitud para size_tlos 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 longC++ no es realmente compatible de todos modos, por lo que lo anterior funcionará bien ya que unsigned longes el tipo integral legal más grande. Después de TR1 puedes usarlo %zude forma segura para size_tlos valores.

D.Shawley avatar Jun 02 '2009 17:06 D.Shawley