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

Mat*_*ner 5 c printf gcc typedef stdint

考虑以下代码:

typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
Run Code Online (Sandbox Code Playgroud)

这在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. 是否有一些更好的方法来标准化用户类型的规格而不是#defineBLKNO_FMT上面那样使用?

jfs*_*jfs 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这并非毫无意义,可变参数函数的整数参数不会被提升为long long. (3认同)