为什么 windows API 调用处理字节(例如 'recv')使用默认签名的 char*?

Why do windows API calls dealing with bytes (such as 'recv') use char*, which is signed by default?

我是 c/c++ 的新手,我正在尝试遵循一些指导原则,建议尽可能使用 stdint.h 定义的类型(uint8_t,等等unsigned char).

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

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

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

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

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

后来,void被发明后,BSD等Unix系统更新了recv的定义,现在都使用void *。进行此更改的动机很明确:char * 并不是一个真正的通用指针,将其用作一个会使您的代码更丑陋,并具有更多的转换。 recvvoid * 版本也由 POSIX 授权,因此唯一没有它的 OS 供应商是最不关心 POSIX 合规性和代码美学...Microsoft。