首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSIX上ssize_t的替代方案--不整合系统

POSIX上ssize_t的替代方案--不整合系统
EN

Stack Overflow用户
提问于 2016-01-03 19:09:32
回答 2查看 2.8K关注 0票数 10

我正在编写一个涉及网络I/O的程序,因此使用了sendrecv,这是POSIX函数。它们返回一个ssize_t,这也是特定于POSIX的。

包装纸看起来就像这个自动取款机:

代码语言:javascript
复制
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

或者我应该如何处理这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-03 19:22:46

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

下面是一种可移植的方法来定义它:

代码语言:javascript
复制
#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
票数 11
EN

Stack Overflow用户

发布于 2021-10-06 17:57:27

我在上面看到一个错误

代码语言:javascript
复制
#elif SIZE_MAX == UINTMAX_MAX
typedef uintmax_t ssize_t;  /* last resort, chux suggestion */
#define SSIZE_MIN  INTMAX_MIN
#define SSIZE_MAX  INTMAX_MAX

应该是

代码语言:javascript
复制
#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 (如果定义的话)应该能够保存任何有符号的整数类型,这使得它成为ssize_t的最后选择。

uintmax_t (如果定义的话)应该能够保存任何无符号整数类型。试图将负数赋值给一个无符号整数会导致返回,从而使该数字为正数,这在这里可能并不需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34580472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档