替代POSIX-unconformant系统上的ssize_t

时间:2016-01-03 19:09:33

标签: c posix

我正在编写一个涉及网络I / O的程序,因此使用了sendrecv,它们是POSIX函数。它们返回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 !)。

C11标准规定的ssize_t有什么好的替代品?也许ptrdiff_t
或者我该如何处理这个问题?

2 个答案:

答案 0 :(得分:5)

如果未定义类型ssize_t,您可以自己定义它。它应该是signed类型,其大小与size_t相同。从技术上讲,类型ptrdiff_t不应小于size_t,但它可能会更大,以适应更大的范围。

这是一种可移植的方式来定义它:

#include <limits.h>
#include <stddef.h>

#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

答案 1 :(得分:-1)

如果运行的是CentOS Linux 8.2.2004版(核心),请在上面的第一行之前插入:

#include <stdint.h>