'signed size_t' 与 'ssize_t' 不同吗?

cer*_*am1 2 android android-ndk

当我使用 ndk-build 编译时,它显示一条错误消息:

警告:格式 '%zd' 需要类型为 'signed size_t' 的参数,但参数 5 的类型为 'ssize_t'。

我以为ssize_t是一样的signed size_t,我错了吗?

Ale*_*ohn 6

在 Android 中,size_tunsigned int,但是ssize_tlong int。要打印或记录ssize_t,只需使用"%ld"

请参阅sys/types.h

传统上,bionic 的 ssize_t 是“long int”。当您将 ssize_t 传递给 printf 样式的函数时,这会导致 GCC 发出警告。正确的类型是 __kernel_ssize_t,它是“int”,这不是 C 代码的 ABI 更改(因为它们的大小相同),而是 C++ 的 ABI 更改,因为“int”和“long int”损坏为“ i" 和 "l" 分别。因此,在我们修复 ABI 之前,不应将此更改传播到 NDK。http://b/8253769

需要注意的是在其他平台上,使用%zdprefferable

  • @AndrewHenle,原则上你是对的。但问题被明确标记为Android。请查看我的更新。 (2认同)