Рассмотрим этот код: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’
- Как я могу сказать
printf
, что я прохождение 64-битного типа? - Есть ли лучший способ стандартизации спецификаций для пользовательских типов, чем с использованием
#define
, напримерBLKNO_FMT
, как указано выше?
Приведение `(Blkno)` бессмысленно, если вы использовали спецификатор правильного формата. – user502515 2010-12-10 10:37:59
Это не бессмысленно, целые аргументы для вариативных функций не продвигаются до долгого времени. – dreamlax 2010-12-10 10:41:17