【问题标题】:format '%lld' expects type 'long long int', but argument 4 has type 'int64_t'格式“%lld”需要类型“long long int”,但参数 4 的类型为“int64_t”
【发布时间】:2015-07-21 08:54:27
【问题描述】:

我尝试使用%lld 格式说明符打印int64_t 类型的变量,但收到以下警告?

警告:格式“%lld”需要类型“long long int”,但参数 4 有类型'int64_t'

在我看来,在linux下,int64_t总是long long int,那么:

  1. 为什么会出现此警告?
  2. 我该如何解决这个问题?

【问题讨论】:

  • 在我看来,在linux下,int64_t总是long long int实际上,并不能保证总是案例。
  • 更重要的是,由于编译器抱怨printf 格式,它很可能不是您平台上的long long,而是long
  • 不要根据意见、偏见、迷信、信仰或同事告诉我的方式进行编程。相反,1)了解规则在哪里,2)学习规则,3)遵守规则。
  • 明确一点:在 64 位 Linux 系统上,int64_t 的类型为 long int,而不是 long long int

标签: c linux


【解决方案1】:

如何解决?

使用PRId64:(不要忘记包含<inttypes.h>

printf("var64 = %" PRId64 "\n", var64);

如果您想将其打印为十六进制,请使用 PRIx64 并正确转换。

int64_t总是long long int,那为什么会出现这个警告呢?

从 C99 开始(link to draft,第 22 页),C 规范建议 long long int 类型应该至少 64 位,但也可能更多。

— long long int 类型对象的最小值
LLONG_MIN -9223372036854775807 // -(263-1)
— long long int 类型对象的最大值
LLONG_MAX +9223372036854775807 // 263− 1

在某些平台上,long long int 可能是 128 位的,而 print 语句在此类平台上调用 UB

所以将此警告视为可移植性问题警告。

【讨论】:

  • 请注意,在 64 位 Linux 上 long long int 有 64 位;但是,int64_t 仍然是 long int 而不是 long long int,因此 gcc 会警告使用 %lld 格式说明符,因为它与类型不匹配(即使它们具有相同的底层表示)。
  • 请注意!我的经验是,在 MacOS/Darwin(64 位)上使用 Clang 时,编译器确实希望我们将 %lld 用于 int64_t(否则会有另一个警告......:D)。但是,在 Linux x64 上,它会导致上述警告。所以真正做到这一点的唯一方法是PRId64,感谢您的回答!但正如您所提到的,在这两种情况下,即使使用 %lld,行为也会很好,因为 %lld 也是 64 位(在此处使用的拱门上)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2014-01-14
  • 2021-01-11
  • 2014-02-03
  • 2015-06-10
  • 2021-05-12
相关资源
最近更新 更多