consideran este código:Printf con typedef enteros, especialmente 64bit
typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
Esto funciona bien y muy bien en x86. En x64, int64_t es en realidad un long
, en lugar de un long long
, y mientras long
y long long
son del mismo tamaño en x64, el compilador genera un error:
src/cpfs/bitmap.c:14: warning: format ‘%lld’ expects type ‘long long int’, but argument 6 has type ‘Blkno’
- ¿Cómo puedo saber que estoy
printf
pasando un tipo de 64 bits? - ¿Existe alguna forma mejor de estandarizar las especificaciones para los tipos de usuario que usando un
#define
comoBLKNO_FMT
como se indica anteriormente?
El molde '(Blkno)' no tiene sentido si ha utilizado el especificador de formato correcto. – user502515
No es inútil, los argumentos enteros a funciones variadas no se promueven a largo plazo. – dreamlax
@ user502515: Sin '(Blkno)' el compilador produce ''advertencia: conversión especifica tipo' largo 'pero el argumento tiene tipo' int '[-Wformat]'' – jfs