linux 中 read 函数的疑问 ? 为什么要绕圈?

hjjdebug 2014-01-02 01:52:39
linux 中 read 函数, 查 man 手册为:
ssize_t read(int fd, void *buf, size_t count);


查头文件:
unistd.h 中定义
__extern_always_inline __wur ssize_t
read (int __fd, void *__buf, size_t __nbytes)

在monetary.h 中定义
#ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined
#endif

在bits/types.h 中有定义
__STD_TYPE __SSIZE_T_TYPE __ssize_t; /* Type of a byte count, or error. */
# define __STD_TYPE __extension__ typedef

在typesizes.h 中有定义
#define __SSIZE_T_TYPE __SWORD_TYPE

在bits/types.h 中
# define __SWORD_TYPE long int

就是说, ssize_t 就是 long int.
谁能告诉我, 头文件中绕了这么一大圈,到底是为什么。 难道它就不能直接一次定义吗?
例如:形如
#ifdef __WORDSIZE == 32
# define ssize_t int
#elif __WORDSIZE == 64
# define ssize_t long int
#endif
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjjdebug 2014-01-08
  • 打赏
  • 举报
回复
引用 4 楼 lyredsoft 的回复:
你不懂,瞎问,也不怕让人笑话。ssize_t是编译器定义的c的基本类型,是c的基本类型,那用什么伪定义的。莫名其妙。 在iso c 中 size 是预定义的无符号数,表示块大小。ssize_t 是预定义的符号数,一般表示块的指针偏移值。 只有在unix系统中才需要伪定义size,但类型是符号数。我没搞过unix,但我猜unix中size可能能同时使用于块大小和指针偏移值,你在搞unix吗? monetary.h 是和locale相关的派生类型。 __STD_TYPE __SSIZE_T_TYPE __ssize_t 是c++库的派生类型。 重定义当然是出于支撑平台的适应性考虑。
不懂,才要问, 什么叫瞎问? 好像你也没讲清楚啊! 怕笑话,你胆子也太小了吧? 若如此,则没法活了。 我在64bits linux 系统上追踪了一下 ssize_t 的定义过程, 发现它辗转定义, 最后等同于long int, 见楼顶贴。 在32bits 系统上, 也许会被定义成int. (我没有查,估计肯定是这样)。 粗略估计,这是为了跨平台而需要的,但没有确切证据, 总之没有真正搞明白。也没有进一步认真去查。 也许继续查为什么32位机器上被定义为int 会有说服力。 发此贴是为了借鉴一下大牛的经验。 自己不懂,还要笑话别人,真的要被人笑话了。
wallkMan 2014-01-06
  • 打赏
  • 举报
回复
你不懂,瞎问,也不怕让人笑话。ssize_t是编译器定义的c的基本类型,是c的基本类型,那用什么伪定义的。莫名其妙。 在iso c 中 size 是预定义的无符号数,表示块大小。ssize_t 是预定义的符号数,一般表示块的指针偏移值。 只有在unix系统中才需要伪定义size,但类型是符号数。我没搞过unix,但我猜unix中size可能能同时使用于块大小和指针偏移值,你在搞unix吗? monetary.h 是和locale相关的派生类型。 __STD_TYPE __SSIZE_T_TYPE __ssize_t 是c++库的派生类型。 重定义当然是出于支撑平台的适应性考虑。
Carl_CCC 2014-01-03
  • 打赏
  • 举报
回复
主要是为了跨多个系统平台,多个cpu平台,cpu还分位数等等。
max_min_ 2014-01-03
  • 打赏
  • 举报
回复
兼容性的问题吧!通用型强
帅得不敢出门 2014-01-02
  • 打赏
  • 举报
回复
楼主想法很好,个人猜想,可能涉及到glibc的演化,原因应该是比较复杂的 单个平台的实现简单,要跨众多平台的话将会涉及到很多问题,各种宏,各种编译条件。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧