Printf с целыми числами typedef, особенно 64-битными - PullRequest
5 голосов
/ 10 декабря 2010

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

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 ]

10 голосов
/ 10 декабря 2010

Используйте 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;
}
0 голосов
/ 10 декабря 2010

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

...