Quiero imprimir una variable de tipo size_ten C, pero parece que size_ttiene un alias para diferentes tipos de variables en diferentes arquitecturas. Por ejemplo, en una máquina (64 bits), el siguiente código no genera 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_ttiene un alias a long int( "%ld"), mientras que en mi máquina de 32 bits size_ttiene un alias de otro tipo.
¿Existe un especificador de formato específicamente para size_t?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
fuente
fuente

&alguna parte?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'cuándo probablemente debería decirsewarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'. ¿Quizás estaba usando en suscanf()lugar cuando recibió estas advertencias?Respuestas:
Sí: use el
zmodificador de longitud: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_tLos otros modificadores de longitud que están disponibles son
hh(parachar),h(parashort),l(paralong),ll(paralong long),j(paraintmax_t),t(paraptrdiff_t) yL(paralong double). Ver §7.19.6.1 (7) del estándar C99.fuente
size_tanssize_t; este último rara vez se utiliza.%zu, porque el argumento no está firmado.zmodificador de longitud no forma parte de C89 / C90. Si está apuntando a un código compatible con C89, lo mejor que puede hacer es enviarunsigned longy usar ellmodificador de longitud, por ejemploprintf("the size is %lu\n", (unsigned long)size);; El soporte tanto de C89 como de sistemas consize_tmayor tamañolonges más complicado y requeriría el uso de una serie de macros de preprocesador.Sí hay. Lo es
%zu(como se especifica en ANSI C99).size_t size = 1; printf("the size is %zu", size);Tenga en cuenta que
size_tno tiene signo, por lo que%ldes doblemente incorrecto: modificador de longitud incorrecto y especificador de conversión de formato incorrecto. En caso de que se lo pregunte,%zdes parassize_t(que está firmado).fuente
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);fuente