59

Quiero imprimir una variable del tipo size_t en C, pero parece que size_t tiene un alias para diferentes tipos de variables en diferentes arquitecturas. Por ejemplo, en una máquina (64 bits) el siguiente código no lanza ninguna advertencia:Plataforma independiente size_t Formatos de formato en c?

size_t size = 1; 
printf("the size is %ld", size); 

pero en mi otra máquina (32 bits) el código anterior genera el siguiente mensaje de advertencia:

advertencia: formato '% ld' espera escribir 'long int *', pero el argumento 3 tiene tipo 'size_t *'

sospecho que esto se debe a la diferencia en el tamaño del puntero, por lo que en mi Máquina de 64 bits size_t tiene un alias de long int ("%ld"), mientras que en mi máquina de 32 bits size_t tiene un alias de otro tipo.

¿Hay un especificador de formato específicamente para size_t?

+0

Su mensaje de advertencia no coincide con el código. La advertencia menciona punteros, su código no tiene ninguno. ¿Has eliminado algunos '&' en algún lugar? – Jens

+0

¿Punteros? No, no recibo ninguna advertencia sobre punteros, de hecho, dependiendo de en qué máquina ejecute el código, a veces no recibo ninguna advertencia. Pruebe el siguiente código de prueba: #include int main() { size_t size = 1; printf ("el tamaño es% ld", tamaño); return 0; } –

+1

Consulte también [Cadena de formato de plataforma cruzada para variables del tipo size_t?] (Http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) . – legoscia

Respuesta

87

Sí: Utilice el modificador z longitud:

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
printf("the size is %zx\n", size); // hex size_t 

Los otros modificadores de longitud que están disponibles son hh (por char), h (por short), l (por long), ll (por long long) , j (para intmax_t), t (para ptrdiff_t) y L (para long double). Ver §7.19.6.1 (7) del estándar C99.

+0

¿Cuál es la diferencia entre zd y zu? Obtengo que zd es decimal, pero está firmado, en caso afirmativo, ¿cómo zd está siendo firmado? –

+1

Es la diferencia entre un 'size_t' y un' ssize_t'; este último rara vez se usa. –

+20

Correcto, entonces en este caso, debería usar '% zu', porque el argumento no tiene firma. – caf

25

Sí, la hay. Es %zu (como se especifica en ANSI C99).

size_t size = 1; 
printf("the size is %zu", size); 

Tenga en cuenta que size_t no tiene signo, por lo tanto es %ld doble mal: modificador de longitud mal y el mal indicador de conversión de formato. En caso de que se lo pregunte, %zd es para ssize_t (que está firmado).

0

MSDN, dice que Visual Studio admite el prefijo "I" para código portátil en plataformas de 32 y 64 bits.

size_t size = 10; 
printf("size is %Iu", size); 
+3

es específico de MS, que no cumple con las normas, por lo que no es independiente de la plataforma –

Cuestiones relacionadas