2010-12-10 4 views
5

Рассмотрим этот код:Printf с TYPEDEF целых, особенно 64bit

typedef int64_t Blkno; 
#define BLKNO_FMT "%lld" 
printf(BLKNO_FMT, (Blkno)some_blkno); 

Это хорошо работает и отлично на x86. На x64, int64_t фактически long, а не long long, и в то время как long и long long имеют одинаковый размер на 64, компилятор генерирует ошибку:

src/cpfs/bitmap.c:14: warning: format ‘%lld’ expects type ‘long long int’, but argument 6 has type ‘Blkno’

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

ответ

10

Использовать 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

Приведение `(Blkno)` бессмысленно, если вы использовали спецификатор правильного формата. – user502515 2010-12-10 10:37:59

+3

Это не бессмысленно, целые аргументы для вариативных функций не продвигаются до долгого времени. – dreamlax 2010-12-10 10:41:17

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^