2009-06-02 16 views
57

Size_t se define como un entero unsigned, 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?¿Cuál es la forma correcta de usar printf para imprimir un tamaño_t?

+2

Posible duplicado de [cadena de formato de plataforma cruzada para variables del tipo de tamaño \ _t?] (Http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size -t) –

+0

@CiroSantilli'm iro iro 视 视 视 Lo dejo abierto porque el duplicado contiene algunas respuestas incorrectas, mientras que esta tiene una respuesta bien aceptada. – edmz

+0

@black, también puede proponer que se cierre en el otro sentido. Cualquiera de los dos está bien para mí. –

Respuesta

83

Trate de usar la cadena %zu formato

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

La porción z es un especificador de longitud que dice el argumento será size_t de longitud.

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

+4

size_t es un tipo sin signo por lo que aún necesita usar 'u' como el tipo de formato y el modificador de longitud 'z'. –

+8

Además, el modificador 'z' es una adición C99 a printf, por lo que no es estrictamente una característica estándar de C++. –

+0

@Charles corrigió la porción u y agregué una etiqueta C al comienzo. Esperaría que esto sea mucho más una característica C que C++, ya que C++ puede seguir la ruta cout. – JaredPar

8

Hay una etiqueta de C++ en esto, así cout << es otra respuesta posible.

Esto es sorprendentemente difícil de obtener en todas las versiones de C. En C90, la conversión 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 forma fiable 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.

7

creo que la respuesta del C++ es:

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

Por estilo C IO que es un poco más complicado. En C99 agregaron el modificador de longitud z para los valores size_t. Sin embargo, previo a TR1 esto no es apoyado lo que se quedan con la fundición 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 no es realmente el apoyo de C++ de todas formas por lo que el anterior funcionará bien ya unsigned long es el tipo integral legal más grande. Después de TR1, puede usar %zu de forma segura para los valores size_t.

Cuestiones relacionadas