在 POSIX 不一致的系统上替代 ssize_t

Alternative to ssize_t on POSIX-unconformant systems

我正在写一个涉及网络的程序I/O,所以使用了sendrecv,它们是POSIX函数。他们 return 一个 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?
或者我应该如何处理这个问题?

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

这里有一个可移植的定义方式:

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

#if SIZE_MAX == UINT_MAX
typedef int ssize_t;        /* common 32 bit case */
#define SSIZE_MIN  INT_MIN
#define SSIZE_MAX  INT_MAX
#elif SIZE_MAX == ULONG_MAX
typedef long ssize_t;       /* linux 64 bits */
#define SSIZE_MIN  LONG_MIN
#define SSIZE_MAX  LONG_MAX
#elif SIZE_MAX == ULLONG_MAX
typedef long long ssize_t;  /* windows 64 bits */
#define SSIZE_MIN  LLONG_MIN
#define SSIZE_MAX  LLONG_MAX
#elif SIZE_MAX == USHRT_MAX
typedef short ssize_t;      /* is this even possible? */
#define SSIZE_MIN  SHRT_MIN
#define SSIZE_MAX  SHRT_MAX
#elif SIZE_MAX == UINTMAX_MAX
typedef uintmax_t ssize_t;  /* last resort, chux suggestion */
#define SSIZE_MIN  INTMAX_MIN
#define SSIZE_MAX  INTMAX_MAX
#else
#error platform has exotic SIZE_MAX
#endif

我发现上面有错别字

#elif SIZE_MAX == UINTMAX_MAX
typedef uintmax_t ssize_t;  /* last resort, chux suggestion */
#define SSIZE_MIN  INTMAX_MIN
#define SSIZE_MAX  INTMAX_MAX

应该是

#elif SIZE_MAX == UINTMAX_MAX
typedef intmax_t ssize_t;  /* last resort, chux suggestion */
#define SSIZE_MIN  INTMAX_MIN
#define SSIZE_MAX  INTMAX_MAX

intmax_t(如果已定义)应该能够容纳任何 signed 整数类型,这使其成为 ssize_t 的最后选择.

uintmax_t(如果已定义)应该能够容纳任何 unsigned 整数类型。尝试将负数分配给无符号整数会导致回绕,以便该数字为正数,这在此处可能是不需要的。