考虑以下代码:
typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
这在x86上运行良好。在x64上,int64_t实际上是long
而不是long long
,而long
和long long
在x64上的大小相同,编译器会生成错误:
src / cpfs / bitmap.c:14:警告:格式'%lld'需要输入'long long int',但参数6的类型为'Blkno'
printf
我正在通过64位类型?#define
之类的BLKNO_FMT
,如上所述?答案 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_t
或uintmax_t
并使用正确的格式说明符来打印这些类型。