如何在Linux下查找一個類型的定義



對於趕時間的朋友,只看第一段就好了。

   首先,我非常肯定以及確定的告訴你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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章