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 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_t
tiene un alias a long int
( "%ld"
), mientras que en mi máquina de 32 bits size_t
tiene 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
z
modificador 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_t
Los 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_t
anssize_t
; este último rara vez se utiliza.%zu
, porque el argumento no está firmado.z
modificador 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 long
y usar ell
modificador de longitud, por ejemploprintf("the size is %lu\n", (unsigned long)size);
; El soporte tanto de C89 como de sistemas consize_t
mayor tamañolong
es 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_t
no tiene signo, por lo que%ld
es doblemente incorrecto: modificador de longitud incorrecto y especificador de conversión de formato incorrecto. En caso de que se lo pregunte,%zd
es 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