引言
typedef 聲明,簡稱 typedef,為現有類型建立一個新的名字。比如人們常常使用 typedef 來編寫更美觀和可讀的代碼。所謂美觀,意指 typedef 能隱藏笨拙的文法構造以及平台相關的資料類型,從而增強可移植性和以及未來的可維護性。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較複雜的型別宣告。
typedef的使用方法如下:
typedef existing_type new_type_name ;
注意:typedef 並不建立新的類型。它僅僅為現有類型添加一個同義字。
typedef的最簡單使用
typedef int size;
typedef unsigned int WORD;
第一個聲明定義了一個char的同義字,名字為C,你可以在任何需要int的上下文使用size。
第二個聲明定義了一個unsigned int的同義字,名字為WORD,你可以在任何需要int的上下文使用WORD。
typedef和數組,指標
我們可以不用象下面這樣重複定義有 81 個字元元素的數組:
char line[81];
char text[81];
定義一個 typedef,每當要用到相同類型和大小的數組時,可以這樣:
typedef char Line[81];
Line text, secondline;
同樣,可以象下面這樣隱藏指標文法:
typedef char * pstr;
pstr str = "abc";
int mystrcmp(pstr, pstr);
typedef和函數
函數指標一般用於回調,例如訊號處理,libcurl等會應用到回調。回調是比較常用的技術,而回調就要涉及函數指標。
當我們的程式中有以下函數:
void printHello(int i);
然後我們要定義一個函數指標,指向printHello,並且調用這個方法,代碼如下:
void (*pFunc)(int);
pFunc = &printHello;
(*pFunc)(110);
其中void (*pFunc)(int)是聲明一個函數指標,指向傳回值是void,調用參數是(int)的函數,變數名是pFunc,pFunc就是函數指標了,以前是函數指標的簡單用法。
大家可以看到,聲明一個函數指標是比較複雜的,尤其是當你要在多處地方聲明同一個類型的函數指標變數,代碼更加複雜,所以有下面簡化的做法:
typedef void (*PrintHelloHandle)(int);
使用代碼如下:
PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);
以後其他地方的程式需要聲明類似的函數指標,只需要下面代碼:
PrintHelloHandle pFuncOther;
這樣,我們的代碼就變得更加簡潔易懂。
typedef心得
大家在看typedef和數組,指標以及typedef和函數,可能會覺得typedef比較複雜,但是其實typedef 行為有點像 #define 宏,用其實際類型替代同義字。
請看看下面例子
typedef char * pstr;
pstr mystr;
代碼pstr mystr,展開之後就是char * mystr,把mystr,替換為語句typedef char * pstr的pstr,展開之後還是char * mystr。
typedef並不建立新的類型,typedef 在編譯時間被解釋,因此讓編譯器來應付超越前置處理器能力的文本替換而已。
這些規則可以應用到typedef和數組:
typedef char Line[81];
Line text;
把text替換為typedef char Line[81]的Line,展開之後就是
char text[81];
也可以應用到最複雜的typedef和指標
typedef void (*PrintHelloHandle)(int);
PrintHelloHandle pFunc;
將pFunc替換typedef void (*PrintHelloHandle)(int),展開之後就是
void (*pFunc)(int);
其實就是聲明一個pFunc函數指標而已,根本沒有PrintHelloHandle這種類型。