Consider this code:
typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
This works well and fine on x86. On x64, int64_t is actually a long
, rather than a long long
, and while long
and long long
are the same size on x64, the compiler generates an error:
src/cpfs/bitmap.c:14: warning: format ‘%lld’ expects type ‘long long int’, but argument 6 has type ‘Blkno’
printf
that I'm passing a 64bit type?#define
like BLKNO_FMT
as above?Use PRId64
from inttypes.h
.
Blkno
is not a very good type name. BLKNO_FMT
could be replaced by PRIdBLKNO
.
#include <inttypes.h>
#include <stdio.h>
typedef int64_t Blkno;
#define PRIdBLKNO PRId64
int main(void) {
printf("%" PRIdBLKNO "\n", (Blkno)1234567890);
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With