我正在编写一个涉及网络I/O的程序,因此使用了send和recv,这是POSIX函数。它们返回一个ssize_t,这也是特定于POSIX的。
包装纸看起来就像这个自动取款机:
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
或者我应该如何处理这个问题呢?
发布于 2016-01-03 19:22:46
如果没有定义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发布于 2021-10-06 17:57:27
我在上面看到一个错误
#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_MAXintmax_t (如果定义的话)应该能够保存任何有符号的整数类型,这使得它成为ssize_t的最后选择。
uintmax_t (如果定义的话)应该能够保存任何无符号整数类型。试图将负数赋值给一个无符号整数会导致返回,从而使该数字为正数,这在这里可能并不需要。
https://stackoverflow.com/questions/34580472
复制相似问题