这就是 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
出于奇怪的原因,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
}