gpt4 book ai didi

c - 在不符合 POSIX 的系统上替代 ssize_t

转载 作者:太空狗 更新时间:2023-10-29 17:23:33 25 4
gpt4 key购买 nike

我正在写一个涉及网络I/O的程序,所以使用了sendrecv,它们是POSIX函数。它们返回 ssize_t,这也是 POSIX 特定的。
wrapper 看起来像这样的 ATM:

ssize_t sock_send(int sock, const void* msg, size_t len) {
return send(sock, msg, len, 0);
}

尽管我在当前的实现中严重依赖 POSIX,但我想让接口(interface)更接近标准,因为我计划稍后编写一个 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

关于c - 在不符合 POSIX 的系统上替代 ssize_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com