typedef 聲明,簡(jiǎn)稱 typedef,為現(xiàn)有類型創(chuàng)建一個(gè)新的名字。比如人們常常使用 typedef 來(lái)編寫更美觀和可讀的代碼。所謂美觀,意指 typedef 能隱藏笨拙的語(yǔ)法構(gòu)造以及平臺(tái)相關(guān)的數(shù)據(jù)類型,從而增強(qiáng)可移植性和以及未來(lái)的可維護(hù)性。
在編程中使用typedef目的一般有兩個(gè),一個(gè)是給變量一個(gè)易記且意義明確的新名字,另一個(gè)是簡(jiǎn)化一些比較復(fù)雜的類型聲明。
typedef的使用方法如下:
typedef existing_type new_type_name ;
注意:typedef 并不創(chuàng)建新的類型。它僅僅為現(xiàn)有類型添加一個(gè)同義字。
typedef int size;
typedef unsigned int WORD;
第一個(gè)聲明定義了一個(gè)char的同義詞,名字為C,你可以在任何需要int的上下文使用size。
第二個(gè)聲明定義了一個(gè)unsigned int的同義詞,名字為WORD,你可以在任何需要int的上下文使用WORD。
我們可以不用象下面這樣重復(fù)定義有 81 個(gè)字符元素的數(shù)組:
char line[81];
char text[81];
定義一個(gè) typedef,每當(dāng)要用到相同類型和大小的數(shù)組時(shí),可以這樣:
typedef char Line[81];
Line text, secondline;
同樣,可以象下面這樣隱藏指針語(yǔ)法:
typedef char * pstr;
pstr str = "abc";
int mystrcmp(pstr, pstr);
函數(shù)指針一般用于回調(diào),例如信號(hào)處理,libcurl等會(huì)應(yīng)用到回調(diào)。回調(diào)是比較常用的技術(shù),而回調(diào)就要涉及函數(shù)指針。
當(dāng)我們的程序中有以下函數(shù):
void printHello(int i);
然后我們要定義一個(gè)函數(shù)指針,指向printHello,并且調(diào)用這個(gè)方法,代碼如下:
void (*pFunc)(int);
pFunc = &printHello;
(*pFunc)(110);
其中void (*pFunc)(int)是聲明一個(gè)函數(shù)指針,指向返回值是void,調(diào)用參數(shù)是(int)的函數(shù),變量名是pFunc,pFunc就是函數(shù)指針了,以前是函數(shù)指針的簡(jiǎn)單用法。
大家可以看到,聲明一個(gè)函數(shù)指針是比較復(fù)雜的,尤其是當(dāng)你要在多處地方聲明同一個(gè)類型的函數(shù)指針變量,代碼更加復(fù)雜,所以有下面簡(jiǎn)化的做法:
typedef void (*PrintHelloHandle)(int);
使用代碼如下:
PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);
以后其他地方的程序需要聲明類似的函數(shù)指針,只需要下面代碼:
PrintHelloHandle pFuncOther;
這樣,我們的代碼就變得更加簡(jiǎn)潔易懂。
大家在看typedef和數(shù)組,指針以及typedef和函數(shù),可能會(huì)覺得typedef比較復(fù)雜,但是其實(shí)typedef 行為有點(diǎn)像 #define 宏,用其實(shí)際類型替代同義字。
請(qǐng)看看下面例子
typedef char * pstr;
pstr mystr;
代碼pstr mystr,展開之后就是char * mystr,把mystr,替換為語(yǔ)句typedef char * pstr的pstr,展開之后還是char * mystr。
typedef并不創(chuàng)建新的類型,typedef 在編譯時(shí)被解釋,因此讓編譯器來(lái)應(yīng)付超越預(yù)處理器能力的文本替換而已。
這些規(guī)則可以應(yīng)用到typedef和數(shù)組:
typedef char Line[81];
Line text;
把text替換為typedef char Line[81]的Line,展開之后就是
char text[81];
也可以應(yīng)用到最復(fù)雜的typedef和指針
typedef void (*PrintHelloHandle)(int);
PrintHelloHandle pFunc;
將pFunc替換typedef void (*PrintHelloHandle)(int),展開之后就是
void (*pFunc)(int);
其實(shí)就是聲明一個(gè)pFunc函數(shù)指針而已,根本沒有PrintHelloHandle這種類型。
聯(lián)系客服