我对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 *
并不是一个真正的通用指针,将其用作一个指针会使代码变得更丑陋,并具有更多的强制类型转换。recv
的void *
版本也是POSIX强制要求的,所以唯一没有它的操作系统供应商是最不关心POSIX合规性和代码美观性的供应商。。。微软