八一八C语言中那些稀奇古怪的类型!

来源:互联网 发布:excel数据上下颠倒 编辑:程序博客网 时间:2024/05/16 01:02

    为了保证可移植性,C语言重定义了许多类型,比如著名的ssize_t,这个看起来很吓人的类型其实就是个int(64位下是long),这篇博文就是来八一八这些看起来很吓人的类型。由于这种类型有很多,本人可能无法一下子写完,故会持续更新!


     首先就来说说ssize_t和size_t这对栾生兄弟吧,首先说结论,ssize_t是定义一个有符号的字,而size_t是定义一个无符号的字,字的长度根据系统位数不同会不同(32位下是4个字节,64位下是8个字节)。那么它们是如何定义的呢?且看俺慢慢分解:

     第一步,在/usr/include/sys/types.h里面定义了这个,

     第二步,在/usr/include/bits/types.h里面定义了这个,

     这里那个__STD_TYPE其实就是typedef。

    第三步,在/usr/include/bits/types.h里面定义了这个,

    第四步,在/usr/include/bits/types.h里面定义了这个,

    最后,绕了这么一个大圈回来,才发现ssize_t原来就是int啊!最后,我简单上一张图来总结一下它这个转换过程:

                         

  而size_t则没有那么麻烦了,都在/usr/lib/gcc/i686-redhat-linux/4.4.4/include/stddef中定义了,其转换过程如下:

                        



接下来要说的一个则是pid_t这个类型,这个就是进程号的一个标识,但也是转换了好多遍,其转换过程如下:

/usr/include/bits/types.h(101行):#define __S32_TYPE int/usr/include/bits/typesizes.h(40行):#define __PID_T_TYPE  __S32_TYPE/usr/include/bits/types.h(143行):__STD_TYPE __PID_T_TYPE __pid_t;/usr/include/sys/types.h(99行):typedef __pid_t pid_t;

总结起来就是这个样子:

                           

uid_t和gid_t,这两种类型是为了标识用户id和组id的!它们的转换过程如下(我列的这些文件都是位于/usr/include这个目录下的):

sys/types.h(81):typedef __uid_t uid_t;bits/types.h(135):__STD_TYPE __UID_T_TYPE __uid_tbits/typesizes.h(31):#define __UID_T_TYPE __U32_TYPE

sys/types.h(81):typedef __gid_t gid_t;bits/types.h(135):__STD_TYPE __GID_T_TYPE __gid_tbits/typesizes.h(31):#define __GID_T_TYPE __U32_TYPE

bits/types.h(102):#define __U32_TYPE unsigned int


到了今天我才明白,原来这些类型都是posix标准定义的,而前面有两个下划线的类型表示属于系统内核定义的类型!所以我感觉这篇博文就是由于我的孤陋寡闻而闹的一个笑话!所以呢,也不好意思继续更新了!还请列位看官付之一笑吧!


0 0
原创粉丝点击