5

考虑这段代码:

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

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

src/cpfs/bitmap.c:14:警告:格式“%lld”需要类型“long long int”,但参数 6 的类型为“Blkno”</p>

  1. 我怎么知道printf我正在传递 64 位类型?
  2. #define有没有比使用上述方法更好的方法来标准化用户类型的规范BLKNO_FMT
4

2 回答 2

10

使用PRId64inttypes.h.

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;
}
于 2010-12-10T09:53:02.677 回答
0

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

于 2010-12-10T14:35:46.173 回答