¿Cuál es la forma correcta de usar printf para imprimir un tamaño_t?

Size_t se define como un entero unsigned signo, pero el tamaño depende de si está en una máquina de 32 o 64 bits. ¿Cuál es la forma correcta y portátil de imprimir un size_t ?

Intenta usar la cadena de formato %zu

 size_t val = get_the_value(); printf("%zu",val); 

La parte z es un especificador de longitud que dice que el argumento tendrá la longitud de size_t.

Fuente – http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

Hay una etiqueta C ++ en esto, entonces cout < < es otra posible respuesta.

Esto es sorprendentemente difícil de conseguir en todas las versiones de C. En C90, el colado a unsigned long debería funcionar, pero eso bien podría no funcionar en C99, y las soluciones 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 haya una forma completamente portátil que funcione para C90, C99 y C ++, aunque existen soluciones para cada una de ellas.

Creo que la respuesta de C ++ es:

 std::size_t n = 1; std::cout < < n; 

Para C-style IO es un poco más complicado. En C99 agregaron el modificador de longitud z para los valores de size_t . Sin embargo, antes de TR1, esto no es compatible, por lo que te queda el casting a un tamaño específico como:

 std::size_t n = 1; std::printf("%lu\n", static_cast(n)); 

Por otra parte, unsigned long long realidad no es compatible con C ++ de todos modos, lo anterior funcionará bien, ya que unsigned long es el tipo legal integral más grande. Después de TR1, puede usar %zu forma segura para los valores de size_t .