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_tcon<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_tes 'z', como en"%zu".uint32_t, pero faltasize_t. La respuesta de @ u0b34a0f6ae incluye ambos.Respuestas:
Parece que esperas
size_tser el mismo queunsigned long(posiblemente 64 bits) cuando en realidad es ununsigned int(32 bits). Intente usar%zuen ambos casos.Sin embargo, no estoy del todo seguro.
fuente
int32_tque estéinten su compilador / plataforma no significa que no pueda estarlongen 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.%lujunto con(unsigned long)ksiempre es correcto.size_tes más complicado, por lo que%zuse agregó en C99. Si no puede usar eso, trátelo comok(longes el tipo más grande en C89,size_tes muy poco probable que sea más grande).Tratar
El
zrepresenta un número entero de la misma longitud quesize_t, y laPRIu32macro, 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_tasí 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.
longes de al menos 32 bits, por lo que%lujunto con(unsigned long)ksiempre es correcto:size_tes más complicado, por lo que%zuse agregó en C99. Si no puede usar eso, trátelo comok(longes el tipo más grande en C89,size_tes muy poco probable que sea más grande).Si no obtiene los especificadores de formato correctos para el tipo que está pasando,
printfhará 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_touintmax_ty 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