Pregunta

Estoy tratando de imprimir tipos como off_t y size_t. ¿Cuál es el marcador de posición correcta para printf() que es portátil

O hay una manera completamente diferente a imprimir esas variables?

¿Fue útil?

Solución

Puede utilizar z para size_t y t para ptrdiff_t como en

printf("%zu %td", size, ptrdiff);

Pero mi página de manual dice alguna biblioteca más antigua utiliza un carácter diferente que z y desalienta el uso de la misma. Sin embargo, es estandarizada (por la norma C99). Para aquellos intmax_t y int8_t de stdint.h y así sucesivamente, hay macros que puede utilizar, como otra respuesta, dijo:

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

Se enumeran en la página de manual de inttypes.h.

En lo personal, me gustaría emitir los valores a unsigned long o long como otra respuesta recomienda. Si utiliza C99, entonces usted puede (y debe, por supuesto) convertido al unsigned long long o long long y utilizar los formatos %llu o %lld respectivamente.

Otros consejos

Para imprimir off_t:

printf("%jd\n", (intmax_t)x);

Para imprimir size_t:

printf("%zu\n", x);

Para imprimir ssize_t:

printf("%zd\n", x);

Vea 7.19.6.1/7 en la norma C99, o la documentación de POSIX más conveniente de los códigos de formato:

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html

Si su aplicación no es compatible con los códigos de formato (por ejemplo, porque estás en C89), entonces usted tiene un poco de un problema, ya que yo sepa no hay tipos enteros en C89 que tienen códigos de formato y están garantizados para ser tan grande como este tipo. Así que hay que hacer algo aplicación específica.

Por ejemplo, si el compilador ha long long y su biblioteca estándar soporta %lld, que con confianza puede esperar que servirá en lugar de intmax_t. Pero si no lo hace, tendrá que recurrir a long, que fallaría en algunas otras implementaciones porque es demasiado pequeño.

Para Microsoft, la respuesta es diferente. VS2013 es en gran parte C99 compatible pero "[l] a hh, j, z, y prefijos longitud T no son compatibles." para size_t "Es decir, __int32 sin signo en plataformas de 32 bits, sin signo __int64 en plataformas de 64 bits" uso prefijo I (ojo de capital) con especificador de tipo o, u, x, o X. Vea Tamaño especificación VS2013

En cuanto a off_t, se define el tiempo en VC \ include sys \ types.h \.

¿Qué versión de C está usando?

En C90, la práctica habitual es lanzar a larga con o sin signo, en su caso, e imprimir en consecuencia. He visto% z para size_t, pero Harbison y Steele no lo mencionan bajo printf (), y en todo caso que no le ayudaría con ptrdiff_t o lo que sea.

En C99, los diversos tipos _T vienen con sus propias macros printf, así que algo como "Size is " FOO " bytes." no sé los detalles, pero eso es parte de una gran formato numérico archivo de inclusión.

Usted querrá utilizar las macros de formato de inttypes.h.

Vea esta pregunta: Cruz cadena de formato de plataforma para las variables de tipo size_t?

En cuanto a man 3 printf en Linux, OS X, y OpenBSD todos muestran apoyo a %z para size_t y %t para ptrdiff_t (por C99), pero ninguno de los off_t mención. Sugerencias en la naturaleza por lo general ofrecen hasta la conversión %u para off_t, que es "suficientemente correcta" en lo que puedo decir (tanto unsigned int y off_t varían de forma idéntica entre sistemas de 64 bits y 32 bits).

vi este post al menos dos veces, porque la respuesta aceptada es difícil para mí remeber (rara vez utilizan banderas z o j y son no parece plataforma independiente ).

El estándar nunca dice claramente la longitud de datos exacta de size_t, así que sugiero que primero debe comprobar la longitud de size_t su plataforma a continuación, seleccione una de ellas:

if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64

Y se sugiere emplear tipos stdint en lugar de tipos de datos en bruto para la consistencia.

Si no recuerdo mal, la única manera portátil para hacerlo, ha de emitir el resultado de "int largo sin signo" y utilizar %lu.

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));

utilizar "% zo" para off_t. (Octal) o "% zu" para decimal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top