為了保證可移植性,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_t
bits/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_t
bits/typesizes.h(31):#define __gid_t_type __u32_type
到了今天我才明白,原來這些型別都是posix標準定義的,而前面有兩個下劃線的型別表示屬於系統核心定義的型別!所以我感覺這篇博文就是由於我的孤陋寡聞而鬧的乙個笑話!所以呢,也不好意思繼續更新了!還請列位看官付之一笑吧!bits/types.h(102):#define __u32_type unsigned int
程式設計師的吐槽 八一八那些讓你感覺蠢哭了的BUG
作為程式設計師,有沒有乙個bug讓你心交力瘁沒日沒夜的加班,找啊找,找出來以後看著這個bug差點一口鮮血噴在顯示器上呢?曾經在同事中間提過這個問題,大家異常激動,爭先恐後發表自己的獲獎感言,提起自己不堪回首的往事無人不捶胸頓足。唉。誰沒有智商餘額不足的時候呢。作為從小就是俺們村久負盛名的馬大哈,我對...
C語言中關於記憶體那些事
c語言的程式記憶體布局,從高到低依次為 棧區 堆區 未初始化資料區 初始化資料區 區。一 棧區 由編譯器自動管理,無需程式設計師手工控制。存放函式的引數值 區域性變數的值等。棧區內容從高位址到低位址分配,從低位址到高位址訪問。int a 0 int b 0 int array 5 printf a....
c語言中那些關鍵字
它的意思是請求編譯器盡可能的將變數存在暫存器中,注意文字的變化,盡可能而不是一定會將變數存在暫存器中。關於暫存器 記憶體 cpu,我在一本書上看到乙個非常形象的比喻,將三者分別當成太監 大臣和皇帝。其工作流程是 資料從大臣 記憶體 那拿出來先放在太監 暫存器 那,然後皇帝 cpu 再從太監 暫存器 ...