5

次のコードを検討してください。

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

これは x86 で問題なく動作します。x64 では、int64_t は実際にはlongではなく であり、long longx64ではlonglong longが同じサイズである場合、コンパイラはエラーを生成します。

src/cpfs/bitmap.c:14: 警告: フォーマット '%lld' はタイプ 'long long int' を想定していますが、引数 6 のタイプは 'Blkno' です</p>

  1. printf64 ビット型を渡していることをどのように確認できますか?
  2. #define上記のようなものを使用するよりも、ユーザータイプの仕様を標準化するためのより良い方法はありBLKNO_FMTますか?
4

2 に答える 2

10

から使用PRId64inttypes.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;
}
于 2010-12-10T09:53:02.677 に答える
0

これらの型は 64 ビット型ではありません。それらはプラットフォーム固有です。intmax_tそれらを印刷する唯一の移植可能な方法は、またはにキャストしuintmax_t、それらの型を印刷するための正しいフォーマット指定子を使用することです。

于 2010-12-10T14:35:46.173 に答える