objective-c - 对于 Apple 实现(Cocoa/CocoaTouch),uint8_t 是否始终与 unsigned char 类型相同?

标签 objective-c c xcode cocoa-touch cocoa

在浏览 iPhone 的示例代码应用程序时,我发现一对发送/接收方法实际上具有相同的签名定义,但其中一个变量关联的值类型除外。

从标题中:

- (void)receivedData: (unsigned char *)data length:(NSUInteger)len;
- (void)sendData:     (uint8_t*)       data length:(NSUInteger) len;

这些方法被用作发送/接收过程的包装器,它有效地传递一个指向 byte 数据数组的指针,这些数据被写入数据流或从数据流中写入。我发现这些方法签名有点奇怪,因为我是 Cocoa/Cocoa Touch 开发人员的新手,所以我决定检查 uint8_t 类型的定义。我发现 uint8_t 被定义为 stdint.h 中的 unsigned char,因此 data 变量因为这些方法是完全一样的。至少,在 XCode 4.2 中链接的 stdint.h 就是这种情况。

然而,对我发现的 uint8_t 类型做了一些进一步的研究 this question关于 uint8_tunsigned char 用法。共识似乎是这两种值类型通常完全相同,但对于 C 标准库的某些实现,它们可能不同。因此,在生成可移植代码时,不应相信它们将是同一类型的数据。

话虽如此,从 Apple/Objective-C 编程环境中可以安全地假设 uint8_t 将与 unsigned char 相同,还是我应该遵循上述问题中给出的相同建议?

这似乎是一个挑剔的问题,但由于我可能正在将这种类型的编码不当行为似乎有点普遍的库集成到可以在多个 Apple 环境中使用的个人代码库中(相当几年后),我想要进一步的评论。

最佳答案

忽略可移植性问题(正如您含蓄地要求我们做的那样),在 Mac OS X 及其衍生产品(如 iOS)下,char 似乎极不可能成为 8 位值以外的任何值。我认为您可以安全地假设 unsigned char 和 uint8_t 将永远相同。

就是说,我认为作为一种供程序员使用的文档形式,当您处理一个旨在保存二进制数据字节而不是字符的值时,使用“byte”或“uint8_t”或一些类似的方法向 future 的读者表明函数的意图是将值视为字节而不是字符本身。

关于objective-c - 对于 Apple 实现(Cocoa/CocoaTouch),uint8_t 是否始终与 unsigned char 类型相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9519667/

相关文章:

objective-c - 通过 NSConnection 同步分布式对象问题

ios - 如何在 objective-c 中的数组上执行 "select"?

c++ - 对以下 c/c++ 解决方案的逻辑解释

ios - 是否有用于解析的 CocoaPods 库?

swift - 除了重构和重命名类或属性名称之外,swift 中还有什么其他可用选项?

xcode - 将操作链接到模态/弹出窗口上的按钮(swift 2 Xcode 7)

Java RMI 服务器和 Objective C 客户端

objective-c - 使用热键切换 NSStatusItem 的菜单打开/关闭 - 代码执行排队/阻止

c - CLOCK_REALTIME CLOCK_MONOTONIC 中哪个时钟最适合计算开始时间结束时间

c - F_SETPIPE_SZ 未声明