1

我对 c/c++ 还很陌生,我正在尝试遵循一些指导方针,这些指导方针建议尽可能使用 stdint.h 定义的类型(uint8_t等而不是unsigned char)。

但是,当您调用需要char*缓冲区的 API 时(例如recv)的 API 时,您似乎必须使用 API 规定的任何类型。

我不明白为什么,如果你正在读取字节,你不希望它是无符号的,所以你得到的值在 0 到 255 之间而不是 -128 和 127 之间。

我不知道这是否是特定于实现的,但我只见过char默认签名。

您是否希望将此类调用的结果转换为unsigned char*uint8_t*允许您解释更高的正值?

4

1 回答 1

2

在 Windows 上,recv是 Winsock API 的一部分,它起源于 4.2BSD 套接字 API 的克隆。4.2BSD 早于 ANSI C 和void关键字,因此使用char *它是因为它在当时是最接近通用指针的东西。

后来,在void发明之后,BSD等Unix系统更新recvvoid *. 这种改变的动机很明确:char *它并不是一个真正的通用指针,使用它会使你的代码更丑陋,并且有更多的强制转换。POSIX 规定的void *版本recv也是如此,因此唯一没有它的操作系统供应商是最不关心 POSIX 合规性和代码美学的供应商......微软。

于 2016-04-16T13:08:30.683 回答