我正在写一个程序,涉及网络I/O,所以send
和recv
使用,这是POSIX功能.它们返回a ssize_t
,也是POSIX特有的.
包装器看起来像这个ATM:
ssize_t sock_send(int sock, const void* msg, size_t len) { return send(sock, msg, len, 0); }
尽管我在当前的实现中严重依赖POSIX,但我希望使接口更贴近标准,因为我计划稍后编写一个Windows实现,其中POSIX不一定可用(该死的,Windows!).
ssize_t
根据C11标准的规定,什么是一个很好的替代品?也许ptrdiff_t
吧?
或者我该如何处理这个问题呢?
如果ssize_t
未定义类型,您可以自己定义它.它应该是一个signed
大小相同的类型size_t
.从技术上讲,类型ptrdiff_t
不应小于size_t
,但它可以更大,以适应更大的范围.
这是一种可移植的方式来定义它:
#include#include #if SIZE_MAX == UINT_MAX typedef int ssize_t; /* common 32 bit case */ #elif SIZE_MAX == ULONG_MAX typedef long ssize_t; /* linux 64 bits */ #elif SIZE_MAX == ULLONG_MAX typedef long long ssize_t; /* windows 64 bits */ #elif SIZE_MAX == USHRT_MAX typedef short ssize_t; /* is this even possible? */ #else #error platform has exotic SIZE_MAX #endif