sintaxis - Plataforma independiente size_t Formatos de formato en c?
size_t c (3)
Sí 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 está firmado, por lo que %ld
es doble incorrecto: modificador de longitud incorrecta y especificador de conversión de formato incorrecto. En caso de que se pregunte, %zd
es para ssize_t
(que está firmado).
Quiero imprimir una variable de 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 arroja ninguna advertencia:
size_t size = 1;
printf("the size is %ld", size);
pero en mi otra máquina (32 bits) el código anterior produce el siguiente mensaje de advertencia:
advertencia: el formato ''% ld'' espera el tipo ''long int *'', pero el argumento 3 tiene el 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
?
Sí: use el modificador de longitud z
:
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
(para char
), h
(para short
), l
(para long
), ll
(para 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.
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);