詳談typedef的用法


我們都知道typedef是類型重定義,既然是重定義就不可能出現新的數據類型,只是將已有的數據類型進行換個名字而已,但是這有什么用呢?可能我們學的時候,給的例子都是:typedef int INT; 然后再用INT去定義一些變量,例如:INT a;

這個就等於int a; 我們當時感覺不出來有什么用,當學到結構體的時候,可能覺得會減少數據類型的寫法,像struct student這樣一個結構體定義變量的時候如果不用typedef就只能struct student(當然這是在C語言中,在C++中可以省略掉struct直接寫student),這樣感覺很麻煩,所以才想到用typedef,但是這是他的用法之一,卻不是為唯一的用法。

typedef的用法主要我總結了一下三點:

用法一:可以減少代碼的書寫量

就像我們經常能考慮到的,結構體這樣“新的”數據類型,用typedef可以簡化,而且不容易出錯.例如:

struct student{

  int data;

  char name[10];

}; 當我們定義學生結構體的時候要這么定義struct student s1,s2,s3; 如果想定義結構體指針,我們可以這么定義,struct student *ps1, ps2; 顯然ps2不是指針類型,但是好多初學者對指針不熟悉,所以容易出錯,但是當我們用typedef的時候,就不會出現這樣的錯誤了,

typedef struct student{

  int data;

  char name[10];

}stu, *pstu;  我們定義的時候可以這么定義stu s1, s2, s3; 定義結構體指針的時候,可以這么定義,pstu ps1, ps2; 這樣ps1, ps2都是指針類型的變量 這是typedef的用法之一,也是比較常用的。

用法二:可以實現代碼的復用性和可擴展性

如果一段代碼沒有擴展性和復用性,那么這段代碼就不能算得上是一段特別規范的代碼,就像我們為了實現代碼的復用性,提高程序可讀性的時候,用函數一樣,提高代碼的復用性和可擴展性是作為軟件開發者必備的本領。一段好的代碼,如果在別的項目中引用的話,如果功能類似,基本上改不了幾行,這就是規范性的重要性(這里先不談規范性,但是這個typedef的用法也涉及規范性,嘿嘿,所以規范是避免不了的)。就這么來說吧,假如我們定義了一個結構體

struct student{

  int score;

  char name[10];

};我們想把成績改成double類型的,應為int的精度太低了,但是下面用到的地方可能都要改掉,但是,我們要是用typedef一下, 問題就變得簡單多了,

typedef int typeitem;

struct student{

  typeitem score;

  char name[10];

};這樣直接改typedef就行了,其他的代碼根本不用動,這就是分層的原因,我們只改變最底層的,上層的東西根本不用變(就像在鏈表中,我們可以把它分為三層,純數據層、節點層、head指針層,也就是整條鏈)這樣分層處理問題會變得簡單得多。還有就是平台不同可以兼容,就像有的平台不支持long double類型,但是你如果定義了long double 直接不能用,但是如果這么  typedef long double typeitem; 直接改成可以支持的類型就行啦,根本不用那么麻煩改下面的代碼,這也是比較重要的用途。

用途三:簡化,提高可讀性

想必大家覺得,這個用途不是包含在上面的用途之中了嗎,為什么還要再說一遍呢,其實我舉個例子你也就明白了,typedef int array[10],這個代表什么意思,這可不是平時那種array[10】是個int了吧,這個代表,array是個重定義的類型,array a; 就代表a是一個含有10個int型元素的數組,這么定義可能覺得簡化不了多少,還不如直接int a[10];看着明白呢,好! 繼續往下看,typedef array Array[5]; 這個呢,如果我這么定義一個變量 Array arr[2]; 這個又是什么意思呢?這個就是定義個Array類型數組,其中這個“一維”數組有兩個元素,但是每個元素又都是Array 類型的,每個Array又是一個5行10列二維數組,所以arr就是一個三維數組,他就等於int arr[2][5][10]; 是不是看的有點蒙了, 其實在C語言中根本不存在多維數組,全部都是一維數組,只是一維數組里面又含一維數組,所以才構成了所謂的“多維”數組, 如果這樣理解的話,是不是覺得多維數組也就不那么“神奇”了,變得簡單了,沒有那么暈了,這樣定義的好處就是可以講一個多維的數組轉化成我們比較熟悉的一維數組,這樣操作起來就比較容易了,可讀性自然也會增強。所以這就是他的“簡化”的作用。其實我們還可以在函數指針上體現,想定義個函數指針int (*p)(); 我們可以定義為typedef int (*POWER)(); 接下來可以直接定義POWER p1, p2; 他就等價於int (*p1)(), int (*p2)(); 這樣也非常易懂。

定義方法:

下面來談一下他的定義過程,說了這么多,還沒講到怎么定義,其實也就三步: 第一步: 按照定義變量的方法先寫出定義體(想必這么都比較熟悉吧), 例如: int a; 第二步: 將變量名換成想要重定義的名字 例如: int INT; 第三步: 在最前面加上typedef 例如: typedef int INT; 整個步驟就完成了,下面就可以用重定義的類型定義變量了:例如: INT a; 就是這么簡單,不要想那么復雜。

還有就是與宏定義區分開來,宏定義是在編譯預處理的時候直接進行的替換,而typedef卻不是,宏定義特別是寫那個表達式的時候新手容易出錯就是不能真正理解宏替換,就像這么例子: #define mul(a, b) a * b ,如果這么寫mul(2, 3)那么恭喜,你對了, 但是如果這么寫, mul(2 + 1, 3 + 4); 你的出來的結果一定是錯的,它只是簡單地替換, 不會像函數那樣會先計算出來2 + 1 等於 3 然后在進行計算, 它只能替換為2 + 1 * 3 + 4 所以結果當然錯了……新手注意點就好了,這東西挺簡單的。

大致就將這么多,如果那里寫的不好,多多指教,多多補充!^_^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM