Android 是';签名大小';不同于';是什么;?

Android 是';签名大小';不同于';是什么;?,android,android-ndk,Android,Android Ndk,使用ndk build编译时,会显示一条错误消息: 警告:格式“%zd”要求参数类型为“signed size\t”,但 参数5的类型为“ssize\u t” 我以为ssize\u t和signed size\u t是一样的,我错了吗?在Android中,size\u t是unsigned int,但ssize\u t是long int。要打印或记录ssize\t,只需使用“%ld” 见: 传统上,仿生的ssize_t是“长整数”。这导致GCC在将ssize_t传递给printf样式函数时发出警

使用ndk build编译时,会显示一条错误消息:

警告:格式“%zd”要求参数类型为“signed size\t”,但 参数5的类型为“ssize\u t”


我以为
ssize\u t
signed size\u t
是一样的,我错了吗?

在Android中,
size\u t
unsigned int
,但
ssize\u t
long int
。要打印或记录
ssize\t
,只需使用“%ld”

见:

传统上,仿生的ssize_t是“长整数”。这导致GCC在将ssize_t传递给printf样式函数时发出警告。正确的类型是“y-Kelnelssisixt”,它是“int”,这不是C代码的ABI更改(因为它们是相同大小),但对于C++来说是一个ABI更改,因为“int”和“long int”分别“i”和“l”。因此,在修复ABI之前,此更改不应传播到NDK


请注意,在其他平台上,使用
%zd
是。

ssize\t的定义因系统而异。有时是
int
,有时是
long
。可能还有一些系统将其定义为
long-long-int

ssize\u t
应该是与
size\u t
宽度相同的有符号整数,因此
%zd
适用于正常构建系统配置中的
ssize\u t

不幸的是,您看到的错误消息表明您的构建系统配置被破坏。这似乎是安卓的一个已知问题。如果您在其他地方看到它,很可能您正在为另一个平台进行交叉编译,但从错误的位置获取一些系统包含文件。检查您的构建是否使用了正确的编译器,以及编译器的sysroot设置是否正确


如果您只是通过更改printf()来解决这个问题,以后可能会遇到更糟糕、更奇怪的问题。

Ooof。不可以。两个
ssize\u t
都是
long int
,要打印或记录
ssize\u t
,只需使用“%ld”是错误的。见@AndrewHenle原则上你是对的。但这个问题被明确标记为Android。请查看我的更新。
printf(“%jd\n”,(intmax\u t)ssize)
可能更好,尤其是对于64位Windows平台,
long
只是一个
int
。谢谢,@AndrewHenle指出这一点。我曾考虑修改以使用PRIdMAX和intmax_t,但我回答的要点实际上是说构建系统配置被破坏了,所以我决定只关注这一点。此外,如果构建系统配置被破坏,PRIdMAX和intmax\t也可能是错误的。