linuxsizet定义,linux和ssize_t和size_t解释
对于赶时间的朋友,只看第⼀段就好了。
⾸先,我⾮常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是⼀样的。size_t 就是⽆符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是⼀样的。在64位没有测试,但是参见百度百科,size_t 在64位下是64位,那么size_t的正确定义应该是typedef unsigned long size_t。
ssize_t:
前⼀阵⼦,上Unix程序设计,问⽼师说ssize_t到底是什么数据类型,⽼师说,你直接⽤就好了,真要知道是什么数据类型,可以去types.h ⾥去看⼀下,回去以后了⼀下没有到就放弃了,今天写代码⼜遇到这个问题,我觉得不是办法,还是得弄清除它到底是什么类型。当然了,对于ssize_t到底是什么数据类型,不知道问题也不⼤,但是对于控制欲强和好奇⼼重的⼈,总是想知道的,⽽且我相信,知道了总会有好处的,写代码的时候⼼⾥有底。
查步骤:
1. 包含头⽂件的时候是这么做的:#include ,执⾏locate types.h跳出⼀堆⽂件,这也是为什么我第⼀次尝试失败的原因。⾸先执⾏locate sys/types.h,就可以到types.h的存放位置了。
types是什么意思2. 打开types.h,搜索 ssize_t,得到如下结果
#ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined
3. 再搜索__ssize_t 就不到任何有价值的信息了,观察⽂件发现,该⽂件还包含了其他头⽂件,也就是 #include ,再次打开
bits/types.h
4. 搜索__ssize_t 到了这么⼀条语句:__STD_TYPE __SSIZE_T_TYPE __ssize_t; 搜索__STD_TYPE_SSIZE ⼜到了这样⼀句话:
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode.  */
# define __STD_TYPE            __extension__ typedef
也就是说,__STD_TYPE __SSIZE_T_TYPE __ssize_t;这条语句其实就是 typedef __SSIZE_T_TYPE __ssize_t,那么重点就是到
__SSIZE_T_TYPE了,搜索__SIZE_T_TYPE,⼜没有什么有价值的信息了,与步骤3类似,我们⼜到了这条语句:#include  ,打开typesizes.h⽂件,搜索__SSIZE_T_TYPE,很轻松的就到了#define __SSIZE_T_TYPE          __SWORD_TYPE,也就是说最开始
的 __STD_TYPE __SSIZE_T_TYPE __ssize_t; 这条语句其实就是 typedef __SWORD_TYPE  __ssize_t,typesize.h⽂件⾥不到
__SWORD_TYPE,于是我们⼜回到了bit/types.h中,结果终于出现了。
5.在bit/types.h中很轻松的就到了下⾯这⼏⾏语句。
#if __WORDSIZE == 32
# define __SQUAD_TYPE          __quad_t
# define __UQUAD_TYPE          __u_quad_t
# define __SWORD_TYPE          int
# define __UWORD_TYPE          unsigned int
# define __SLONG32_TYPE        long int
# define __ULONG32_TYPE        unsigned long int
# define __S64_TYPE            __quad_t
# define __U64_TYPE            __u_quad_t
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode.  */
# define __STD_TYPE            __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE          long int
# define __UQUAD_TYPE          unsigned long int
# define __SWORD_TYPE          long int
# define __UWORD_TYPE          unsigned long int
# define __SLONG32_TYPE        int
# define __ULONG32_TYPE        unsigned int
# define __S64_TYPE            long int
# define __U64_TYPE            unsigned long int
/* No need to mark the typedef with __extension__.  */
# define __STD_TYPE            typedef
#else
# error
#endif
我们⼏乎都可以猜到__WORDSIZE是什么意思了,它的定义在#include 中,表⽰计算机系统是⼏位的。从上⾯我们知道,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。
size_t:
晕,size_t的资料居然了半天。size_t⼤家都知道,是⽆符号整型,在/usr/include/i386-linux-gnu/sys/stddef.h下看到这么⼏条语句:
/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
#else
#define __size_t
#endif
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ long unsigned int
#endif
#if !(defined (__GNUG__) && defined (size_t))
typedef __SIZE_TYPE__ size_t;
#ifdef __BEOS__
typedef long ssize_t;
可以肯定的是,size_t是⽆符号整型,⾄于是long型,还是int型,可能不同的编译器有不同的定义,我这⾥没有64位的机器,⽆法验证。这也验证了我们上⾯所说的ssize_t其实就是⼀个long。
下⾯的是⼀点附加资料,证明我到的是正确的。:-)
⼀个基本的⽆符号整数的C / C + +类型。 它是sizeof操作符返回的结果类型。 该类型的⼤⼩是选择,因此,它可以存储在理论上是可能的任何类型的数组的最⼤⼤⼩。 在32位系统为size_t将采取32位和64位 -
64位。
Data Type: ssize_t
This data type is used to represent the sizes of blocks that can be read or written in a single operation. It is similar to size_t, but must be a signed type.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。