關鍵字 分節18(typedef)

2021-07-23 13:40:29 字數 2185 閱讀 2296

有這樣乙個笑話:乙個獵人在河邊抓捕一條蛇,蛇逃進了水裡。過一會,乙個烏龜爬到岸邊。獵人一把抓住這個烏龜,大聲的說道:小樣,別你為你穿了個馬甲我就不認識你 了!

typedef 關鍵字是個偉大的縫紉師,擅長做馬甲,任何東西穿上這個馬甲就立馬變樣。 它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長著翅膀的鳥人變成天使, 同樣也能把美麗的天使變成鳥人。所以,你千萬不要得罪它,一定要掌握它的脾氣,不然 哪天我把你當鳥人,你可別怪我。^_^。

歷史的誤會----也許應該是typerename

很多人認為typedef 是定義新的資料型別,這可能與這個關鍵字有關。本來嘛,type 是 資料型別的意思;def(ine)是定義的意思,合起來就是定義資料型別啦。不過很遺憾,這種 理解是不正確的。也許這個關鍵字該被替換為「typerename」或是別的詞。

typedef 的真正意思是給乙個已經存在的資料型別(注意:是型別不是變數)取乙個別

名,而非定義乙個新的資料型別。比如:華美絕倫的芍藥,就有個別名---「將離」。中國古 代男女交往,往往以芍藥相贈,表達惜別之情,送芍藥就意味著即將分離。所以文人墨客就給芍 藥取了個意味深長的別名-----「將離」。這個新的名字就表達了那種依依不捨的惜別之情… 這樣新的名字與原來的名字相比,就更能表達出想要表達的意思。

在實際專案中,為了方便,可能很多資料型別(尤其是結構體之類的自定義資料型別) 需要我們重新取乙個適用實際情況的別名。這時候typedef 就可以幫助我們。例如: typedef struct student stu_st,*stu_pst;//命名規則請參考本章前面部分 a),struct student stu1;和stu_st stu1;沒有區別。

b),struct student *stu2;和stu_pst stu2;和stu_st *stu2;沒有區別。

這個地方很多初學者迷惑,b)的兩個定義為什麼相等呢?其實很好理解。我們把

「struct student 」看成乙個整體,typedef 就是給「struct student 」取了個

別名叫「stu_st」;同時給「struct student  *」取了個別名叫「stu_pst」。只不過這兩

個名字同時取而已,好比你給你家小狗取了個別名叫「大黃」,同時你妹妹給小狗帶了小帽 子,然後給它取了個別名叫「小可愛」。^_^。 好,下面再把typedef 與const 放在一起看看: c),const stu_pst stu3; d),stu_pst const stu4;

大多數初學者認為c)裡const 修飾的是stu3 指向的物件;d)裡const 修飾的是stu4

這個指標。很遺憾,c)裡const 修飾的並不是stu3 指向的物件。那const 這時候到底修飾 的是什麼呢?我們在講解const int i 的時候說過const 放在型別名「int」前後都行;而const int *p 與int * const p 則完全不一樣。也就是說,我們看const 修飾誰都時候完全可以將資料類 型名視而不見,當它不存在。反過來再看「const stu_pst stu3」,stu_pst 是「struct student  *」的別名, 「struct student  *」是乙個整體。對於編譯器來說,只認為 stu_pst 是乙個型別名,所以在解析的時候很自然的把「stu_pst」這個資料型別名忽略掉。 現在知道const 到底修飾的是什麼了吧?^_^。

typedef 與#define 的區別

噢,上帝!這真要命!別急,要命的還在後面呢。看如下例子: e), #define int32 int unsigned int32 i = 10; f),typedef int int32; unsigned int32 j = 10;

其中f)編譯出錯,為什麼呢?e)不會出錯,這很好理解,因為在預編譯的時候int32 被替換為int,而unsigned int i = 10;語句是正確的。但是,很可惜,用typedef 取的別 名不支援這種型別擴充套件。另外,想想typedef static int int32 行不行?為什麼? 下面再看乙個與#define 巨集有關的例子: g),#define pchar char* pchar p3,p4;

h),typedef char* pchar; pchar p1,p2;

兩組**編譯都沒有問題,但是,這裡的p4 卻不是指標,僅僅是乙個char 型別的字元。 這種錯誤很容易被忽略,所以用#define 的時候要慎之又慎。關於#define 當然還有很多話題 需要討論,請看預處理那一章。當然關於typedef 的討論也還沒有結束,在指標與陣列那一 章,我們還要繼續討論。

列舉 typedef關鍵字

1 列舉型別介紹及定義 目前為止接觸到的資料型別 基本資料型別 指標型別 空型別 void 構造型別 陣列 結構體 列舉型別 a 列舉型別 列舉型別定義的一般形式 enum 列舉型別名 在列舉值中應羅列出所有可用值。這些值也稱為列舉單元。列舉型別是一種基本型別,而不是一種構造型別,因為它不能再分解任...

關鍵字 分節4(sizeof)

常年被人誤認為函式sizeof sizeof 是關鍵字不是函式,其實就算不知道它是否為32 個關鍵字之一時,我們也可以 借助編譯器確定它的身份。看下面的例子 int i 0 a sizeof int b sizeof i c sizeof int d sizeof i 毫無疑問,32 位系統下a b...

關鍵字 分節10(const)

const 關鍵字也許該被替換為readolny const 是constant 的縮寫,是恆定不變的意思,也翻譯為常量 常數等。很不幸,正是 因為這一點,很多人都認為被const 修飾的值是常量。這是不精確的,精確的說應該是唯讀 的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容...