为什么 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 *
并不是一个真正的通用指针,将其用作一个会使您的代码更丑陋,并具有更多的转换。 recv
的 void *
版本也由 POSIX 授权,因此唯一没有它的 OS 供应商是最不关心 POSIX 合规性和代码美学...Microsoft。
我是 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 *
并不是一个真正的通用指针,将其用作一个会使您的代码更丑陋,并具有更多的转换。 recv
的 void *
版本也由 POSIX 授权,因此唯一没有它的 OS 供应商是最不关心 POSIX 合规性和代码美学...Microsoft。