【发布时间】:2016-11-05 22:21:34
【问题描述】:
我将 32 位 ARM 代码移植到 64 位 x86 并遇到以下错误:
format '%lli' expects argument of type 'long long int',
but argument 3 has type 'int64_t'
我发现了很多关于在这种情况下使用 PRIi64 的信息,但没有找到关于“为什么我不能使用 lli?”的信息。
#include <stdio.h>
#include <inttypes.h>
int main() {
int64_t hugo = 993;
long long int fred = 994;
printf("%s -> %" PRIi64 " lli -> %lli\n", PRIi64, hugo, fred);
return 0;
}
上面的代码编译没有错误并打印li -> 993 lli -> 994。那么,如果两者的大小相同,为什么我需要 li 用于 int64_t(8 字节)和 lli 用于 long long int(8 字节)?
我发现一篇帖子说它是a portability issue warning。所以关掉这个警告是省事吗? (我发现的唯一标志是-Wno-format,它禁用了很多检查......)
【问题讨论】:
-
lld没有出现在您的代码中?请发布产生消息的确切代码。 -
int64_t顾名思义是 8 个字节的固定大小。但是,long long int的大小取决于实现。 -
所以我希望在为
lli与给定参数不匹配的系统编译时收到此警告 - 例如其中lli需要一个 128 位整数。 -
@Charly 根据 C 标准,即使底层类型相同,lld 也不匹配 int64_t,因此 gcc 警告您是正确的。
-
PRIu64应该是PRIi64。