为什么gcc必须将int64识别为long int?

问题描述 投票:0回答:1

这就是 liblwgeom_topo.h 中 LWT_ELEMID 的定义方式:

typedef int64_t LWT_INT64;
typedef LWT_INT64 LWT_ELEMID;

我包含此 .h 文件并在 LWT_ELEMID 类型中定义一些参数。

但它总是这样警告我: /home/user/xxx.c:880:36: 警告:格式 '%lld' 需要类型为 'long long int' 的参数,但参数 3 的类型为 'LWT_ELEMID' {aka 'const long int'} [-Wformat= ]

或者像这样: /home/user/xxx.c:3034:19:注意:预期为“LWT_ELEMID *”{aka“long int *”},但参数类型为“lint64 *”{aka“long long int *”}

我的环境:

线程模型:posix

gcc版本:8.3.0(Ubuntu 8.3.0-6ubuntu1)

目标:x86_64-linux-gnu

c gcc compiler-warnings
1个回答
2
投票

出于奇怪的原因,Linux 的 gcc 将

long
制作为 64 位(尽管
long long
已经永远可用),从而破坏了与 32 位系统的向后兼容性。因此,您必须使用
%ld
,或者更好的是,避免整个
long
崩溃并使用 inttypes.h 中的可移植
PRIi64
转换说明符。

示例:

#include <inttypes.h> // includes stdint.h internally
#include <stdio.h>

int main (void)
{
  typedef int64_t LWT_INT64;
  typedef LWT_INT64 LWT_ELEMID;
  LWT_ELEMID x = 123;

  printf("%"PRIi64 "\n", x); // PRIi64 is a string literal, hence this syntax
}
© www.soinside.com 2019 - 2024. All rights reserved.