引言
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這種類型。