具有 typedef 整数的 Printf,尤其是 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位类型? - 有没有比使用上面的
BLKNO_FMT
这样的#define
更好的方法来标准化用户类型的规范?
Consider this code:
typedef int64_t Blkno;
#define BLKNO_FMT "%lld"
printf(BLKNO_FMT, (Blkno)some_blkno);
This works well and fine on x86. On x64, int64_t is actually a long
, rather than a long long
, and while long
and long long
are the same size on x64, the compiler generates an error:
src/cpfs/bitmap.c:14: warning: format ‘%lld’ expects type ‘long long int’, but argument 6 has type ‘Blkno’
- How can I tell
printf
that I'm passing a 64bit type? - Is there some better way to standardize specs for user types than using a
#define
likeBLKNO_FMT
as above?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用
inttypes.h
PRId64 >。Blkno
不是一个很好的类型名称。BLKNO_FMT
可以替换为PRIdBLKNO
。Use
PRId64
frominttypes.h
.Blkno
is not a very good type name.BLKNO_FMT
could be replaced byPRIdBLKNO
.这些类型不是 64 位类型。它们是特定于平台的。打印它们的唯一可移植方法是转换为
intmax_t
或uintmax_t
并使用正确的格式说明符来打印这些类型。These types are not 64-bit types. They're platform-specific. The only portable way to print them is to cast to
intmax_t
oruintmax_t
and use the correct format specifiers for to print those types.