Pregunta

Quiero imprimir una variable de tipo size_t en C pero parece que es alias size_t a diferentes tipos de variables en diferentes arquitecturas. Por ejemplo, en una máquina (64-bit) el siguiente código no lanza cualquier advertencia:

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 Tipo   'Long int *', pero el argumento tiene 3 Tipo   'Size_t *'

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

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

¿Fue útil?

Solución

Sí: utilizar el modificador de longitud z:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
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 (por intmax_t), t (por ptrdiff_t), y L ( para long double). Ver §7.19.6.1 (7) de la norma C99.

Otros consejos

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

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

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

MSDN , dice que Visual Studio es compatible con el prefijo "I" para el código portable en 32 plataformas y 64 bits.

size_t size = 10;
printf("size is %Iu", size);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top