Printf с целыми числами typedef, особенно 64-битными

Рассмотрим этот код:

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"

  1. Как я могу сказать printf что я передаю 64 битный тип?
  2. Есть ли лучший способ стандартизировать спецификации для пользовательских типов, чем использование #define лайк BLKNO_FMT как указано выше?

2 ответа

Решение

Использование PRId64 от inttypes.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;
}

Эти типы не являются 64-битными. Они зависят от платформы. Единственный портативный способ распечатать их - это intmax_t или же uintmax_t и используйте правильные спецификаторы формата для печати этих типов.

Другие вопросы по тегам