Tengo lo siguiente
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]\n", i, k);
Recibo la siguiente advertencia al compilar:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
Cuando ejecuté esto usando una férula, obtuve lo siguiente:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
Muchas gracias por cualquier consejo,
uint32_t
con<stdint.h>
o<inttypes.h>
; si desea utilizar esos tipos, debe actualizar a C89. Como extensión, es probable que GCC le permita usarlos, pero C89 no tenía tal soporte.size_t
es 'z', como en"%zu"
.uint32_t
, pero faltasize_t
. La respuesta de @ u0b34a0f6ae incluye ambos.Respuestas:
Parece que esperas
size_t
ser el mismo queunsigned long
(posiblemente 64 bits) cuando en realidad es ununsigned int
(32 bits). Intente usar%zu
en ambos casos.Sin embargo, no estoy del todo seguro.
fuente
int32_t
que estéint
en su compilador / plataforma no significa que no pueda estarlong
en otro. Lo mismo parasize_t
. En realidad, se está esforzando y haciendo más trabajo para detectar este error de portabilidad, ya que la verificación fácil y natural sería simplemente respetar el typedef como lo hace el compilador.%lu
junto con(unsigned long)k
siempre es correcto.size_t
es más complicado, por lo que%zu
se agregó en C99. Si no puede usar eso, trátelo comok
(long
es el tipo más grande en C89,size_t
es muy poco probable que sea más grande).Tratar
El
z
representa un número entero de la misma longitud quesize_t
, y laPRIu32
macro, definida en el encabezado C99inttypes.h
, representa un número entero de 32 bits sin signo.fuente
printf( "%lu", (unsigned long )i )
. De lo contrario, uno termina más tarde con un montón de advertencias en todo el código debido a un cambio de tipo.uint32_t
así que en realidad es código C99, y debería compilarse como tal.Todo lo que se necesita es que los especificadores de formato y los tipos estén de acuerdo, y siempre puede transmitir para que eso sea cierto.
long
es de al menos 32 bits, por lo que%lu
junto con(unsigned long)k
siempre es correcto:size_t
es más complicado, por lo que%zu
se agregó en C99. Si no puede usar eso, trátelo comok
(long
es el tipo más grande en C89,size_t
es muy poco probable que sea más grande).Si no obtiene los especificadores de formato correctos para el tipo que está pasando,
printf
hará el equivalente a leer demasiada o muy poca memoria de la matriz. Siempre que use conversiones explícitas para emparejar tipos, es portátil.fuente
Si no desea usar las macros PRI *, otro enfoque para imprimir CUALQUIER tipo de entero es convertir a
intmax_t
ouintmax_t
y usar"%jd"
o%ju
, respectivamente. Esto es especialmente útil para los tipos POSIX (u otros sistemas operativos) que no tienen macros PRI * definidas, por ejemplooff_t
.fuente