Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Printf with typedef integers, especially 64bit

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’

  1. How can I tell printf that I'm passing a 64bit type?
  2. Is there some better way to standardize specs for user types than using a #define like BLKNO_FMT as above?
like image 904
Matt Joiner Avatar asked Dec 10 '10 09:12

Matt Joiner


1 Answers

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;
}
like image 193
jfs Avatar answered Sep 28 '22 01:09

jfs