Plataforma especificadores de formato size_t independientes en c?
-
22-09-2019 - |
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
?
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);