在 POSIX 不一致的系统上替代 ssize_t
Alternative to ssize_t on POSIX-unconformant systems
我正在写一个涉及网络的程序I/O,所以使用了send
和recv
,它们是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 整数类型。尝试将负数分配给无符号整数会导致回绕,以便该数字为正数,这在此处可能是不需要的。
我正在写一个涉及网络的程序I/O,所以使用了send
和recv
,它们是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 整数类型。尝试将负数分配给无符号整数会导致回绕,以便该数字为正数,这在此处可能是不需要的。