c语言 - 为什么处理字节(例如"recv")的 Windows API 调用使用默认签名的 char*?



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

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

我不明白的是,如果你在读字节,为什么不希望它是无符号的,所以你得到的值在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强制要求的,所以唯一没有它的操作系统供应商是最不关心POSIX合规性和代码美观性的供应商。。。微软

最新更新