• Unix编程之size_t、ssize_t


    http://blog.csdn.net/lalor/article/details/7426184

    首先,我非常肯定以 及确定的告诉你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 <sys/types.h>,执行locate types.h跳出一堆文件,这也是为什么我第一次尝试失败的原因。首先执行locate sys/types.h,就可以找到types.h的存放位置了。

        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>,再次打开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 <bits/typesizes.h>  ,打开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 <bits/wordsize.h>中,表示计算机系统是几位的。从上面我们知道,在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位。

    参考资料:http://baike.baidu.com/view/3236587.htm

    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.参考资料:http://www.delorie.com/gnu/docs/glibc/libc_239.html
  • 相关阅读:
    keepalived安装
    Nginx学习笔记
    使用xhprof分析php性能
    使用 .bash_profile与.bashrc修改字符集
    Mysql分区简述
    c语言多线程队列读写
    setsockopt 设置 SO_LINGER 选项
    nginx配置rewrite
    使用PHP+ajax打造聊天室应用
    UDP/TCP通信小记
  • 原文地址:https://www.cnblogs.com/jingzhishen/p/4409767.html
Copyright © 2020-2023  润新知