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"
- Как я могу сказать
printf
что я передаю 64 битный тип? - Есть ли лучший способ стандартизировать спецификации для пользовательских типов, чем использование
#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
и используйте правильные спецификаторы формата для печати этих типов.