具有typedef整数的Printf,尤其是64位

时间:2010-12-10 09:40:55

标签: c gcc printf typedef stdint

考虑以下代码:

typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);

这在x86上运行良好。在x64上,int64_t实际上是long而不是long long,而longlong long在x64上的大小相同,编译器会生成错误:

  

src / cpfs / bitmap.c:14:警告:格式'%lld'需要输入'long long int',但参数6的类型为'Blkno'

  1. 如何告诉printf我正在通过64位类型?
  2. 是否有更好的标准化用户类型规范的方法,而不是使用#define之类的BLKNO_FMT,如上所述?

2 个答案:

答案 0 :(得分:10)

使用inttypes.h中的PRId64

Blkno不是一个非常好的类型名称。 BLKNO_FMT可以替换为PRIdBLKNO

#include <inttypes.h>
#include <stdio.h>

typedef int64_t Blkno;
#define PRIdBLKNO PRId64

int main(void) {
  printf("%" PRIdBLKNO "\n", (Blkno)1234567890);
  return 0;
}

答案 1 :(得分:0)

这些类型不是64位类型。它们是特定于平台的。打印它们的唯一可移植方式是强制转换为intmax_tuintmax_t并使用正确的格式说明符来打印这些类型。