具有 typedef 整数的 Printf,尤其是 64 位

发布于 2024-10-06 20:09:39 字数 539 浏览 2 评论 0原文

考虑一下这段代码:

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

这在 x86 上运行良好。在 x64 上,int64_t 实际上是一个 long,而不是一个 long long,而 longlong long 是在 x64 上相同的大小,编译器会生成错误:

src/cpfs/bitmap.c:14:警告:格式“%lld”需要类型“long long int”,但参数 6 的类型为“Blkno”

  1. 我如何告诉 printf 我正在传递64位类型?
  2. 有没有比使用上面的 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’

  1. How can I tell printf that I'm passing a 64bit type?
  2. Is there some better way to standardize specs for user types than using a #define like BLKNO_FMT as above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒猫 2024-10-13 20:09:39

使用 inttypes.hPRId64 >。

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;
}

Use PRId64 from inttypes.h.

Blkno is not a very good type name. BLKNO_FMT could be replaced by PRIdBLKNO.

#include <inttypes.h>
#include <stdio.h>

typedef int64_t Blkno;
#define PRIdBLKNO PRId64

int main(void) {
  printf("%" PRIdBLKNO "\n", (Blkno)1234567890);
  return 0;
}
笨笨の傻瓜 2024-10-13 20:09:39

这些类型不是 64 位类型。它们是特定于平台的。打印它们的唯一可移植方法是转换为 intmax_tuintmax_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 or uintmax_t and use the correct format specifiers for to print those types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文