轉(zhuǎn)載自typedef介紹
本文介紹C語言中的關鍵字 typedef 的用法。 在C++11中用using替代typedef
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、安鄉(xiāng)網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5頁面制作、購物商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿(mào)營銷網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為安鄉(xiāng)等各大城市提供網(wǎng)站開發(fā)制作服務。
typedef 為C語言的關鍵字,作用是為一種數(shù)據(jù)類型定義一個新名字,這里的數(shù)據(jù)類型包括內(nèi)部數(shù)據(jù)類型(int,char等)和自定義的數(shù)據(jù)類型(struct等)。
typedef 本身是一種存儲類的關鍵字,與 auto、extern、static、register 等關鍵字不能出現(xiàn)在同一個表達式中。
使用 typedef 定義新類型的方法(步驟):在傳統(tǒng)的變量聲明表達式里,用(新的)類型名替換變量名,然后把關鍵字 typedef 加在該語句的開頭就可以了。
下面以兩個示例,描述 typedef 的用法步驟。
示例1:
【第一步】:int a; ———— 傳統(tǒng)變量聲明表達式
【第二步】:int myint_t; ———— 使用新的類型名myint_t替換變量名a
【第三步】:typedef int myint_t;
———— 在語句開頭加上typedef關鍵字,myint_t
就是我們定義的新類型
C++11:using myint_t=int;
示例2:
【第一步】:void (pfunA)(int a); ———— 傳統(tǒng)變量(函數(shù))聲明表達式
【第二步】:void (PFUNA)(int a); ———— 使用新的類型名PFUNA替換變量名pfunA
【第三步】:typedef void (*PFUNA)(int a);
———— 在語句開頭加上typedef關鍵字,PFUNA
就是我們定義的新類型
C++11:using PFUNA=void(*)(int a)
表示一個函數(shù)指針
特別強調(diào):上述兩個示例,僅僅為了演示 typedef 的用法步驟,便于新手記憶 typedef 的用法。在實際編寫代碼時,只有“第三步”對應的語句會寫入代碼中!
typedef 的作用有以下幾點:
1)typedef 的一個重要用途是定義機器無關的類型。例如,定義一個叫“REAL”的浮點類型,該浮點類型在目標機器上可以獲得最高的精度:
typedef long double REAL;
如果在不支持 long double 的機器上運行相關代碼,只需要修改對應的 typedef 語句,例如:
typedef double REAL;
或者:
typedef float REAL;
2)使用 typedef 為現(xiàn)有類型創(chuàng)建別名,給變量定義一個易于記憶且意義明確的新名字。例如:
typedef unsigned int UINT
3)使用 typedef 簡化一些比較復雜的類型聲明,例如:
typedef void (*PFunCallBack)(char* pMsg, unsigned int nMsgLen);
上述聲明引入了 PFunCallBack 類型作為函數(shù)指針的同義字,PFunCallBack 類型定義的指針會指向一個函數(shù),該函數(shù)包含兩個類型分別為 char* 和 unsigned int 的參數(shù),以及一個類型為 void 的返回值。通常,當函數(shù)的參數(shù)是一個回調(diào)函數(shù)時,就可能會使用 typedef 來簡化聲明。
例如,承接上面的示例的后續(xù)示例如下:
RedisSubCommand(const string& strKey, PFunCallBack pFunCallback, bool bOnlyOne);
*注意:*上述語句中類型名 PFunCallBack 與變量名 pFunCallback 的大小寫區(qū)別。
RedisSubCommand 函數(shù)的第二個參數(shù)是一個回調(diào)函數(shù),因此通過“PFunCallBack pFunCallback”(即,類型+變量)的形式,給出對應回調(diào)函數(shù)(pFunCallback)的地址。
在這個示例中,如果不使用 typedef 簡化聲明,RedisSubCommand 的函數(shù)聲明內(nèi)容如下:
RedisSubCommand(const string& strKey, void (*pFunCallback)(char* pMsg, unsigned int nMsgLen), bool bOnlyOne);
從上面兩個函數(shù)聲明可以看出,在不使用 typedef 的情況下,RedisSubCommand 函數(shù)的聲明會復雜得多,不利于代碼的維護,同時增加出錯風險。
所以,在某些復雜的類型聲明中,使用 typedef 進行聲明的簡化是很有必要的。
兩者的區(qū)別如下:
通常,使用 typedef 要比使用 #define 要好,特別是在有指針的場合里。
下面列舉幾個示例。
代碼如下:
typedef char* pStr1;
#define pStr2 char*
pStr1 s1, s2;
pStr2 s3, s4;
在上述的變量定義中,s1、s2、s3都被定義為 char* 類型;但是s4則定義成了 char 類型,而不是我們所預期的指針變量 char*,這是因為 #define 只做簡單的字符串替換,替換后的相關代碼等同于為:
char* s3, s4;
而使用 typedef 為 char* 定義了新類型 pStr1 后,相關代碼等同于為:
char *s3, *s4;
代碼如下:
typedef char *pStr;
char string[5]="test";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;
在編譯過程中,報錯如下:
根據(jù)上述錯誤信息能夠看出,p2 為只讀常量,所以 p2++ 出錯了。這個問題再一次提醒我們:typedef 和 #define 不同,typedef 不是簡單的文本替換,上述代碼中 const pStr p2 并不等于 const char * p2,pStr 是作為一個類型存在的,所以 const pStr p2 實際上是限制了 pStr 類型的 p2 變量,對 p2 常量進行了只讀限制。也就是說,const pStr p2 和 pStr const p2 本質(zhì)上沒有區(qū)別(可類比 const int p2 和 int const p2),都是對變量 p2 進行只讀限制,只不過此處變量 p2 的數(shù)據(jù)類型是我們自己定義的 pStr,而不是系統(tǒng)固有類型(如 int)而已。
所以,const pStr p2 的含義是:限定數(shù)據(jù)類型為 char * 的變量 p2 為只讀,因此 p2++ 錯誤。
*注意:*在本示例中,typedef 定義的新類型與編譯系統(tǒng)固有的類型沒有差別。
網(wǎng)頁名稱:C語言中的typedef介紹,和C++11中using的用法補充
當前鏈接:http://chinadenli.net/article14/dsoipde.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站內(nèi)鏈、云服務器、響應式網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)頁設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)