typedef的用法及與define的區(qū)別總結(jié)

typedef的用法及與define的區(qū)別總結(jié)

ID:35295028

大小:37.00 KB

頁數(shù):3頁

時間:2019-03-23

typedef的用法及與define的區(qū)別總結(jié)_第1頁
typedef的用法及與define的區(qū)別總結(jié)_第2頁
typedef的用法及與define的區(qū)別總結(jié)_第3頁
資源描述:

《typedef的用法及與define的區(qū)別總結(jié)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫

1、一、typedef的用法在C/C++語言中,typedef常用來定義一個標(biāo)識符及關(guān)鍵字的別名,它是語言編譯過程的一部分,但它并不實際分配內(nèi)存空間,實例像:typedefintINT;typedefintARRAY[10];typedef(int*)pINT;typedef可以增強程序的可讀性,以及標(biāo)識符的靈活性,但它也有“非直觀性”等缺點。typedef還可以掩飾符合類型,如指針和數(shù)組。例如,你不用象下面這樣重復(fù)定義有81個字符元素的數(shù)組:charline[81];chartext[81];定義一個typedef,每當(dāng)要用到相同類型和大小的數(shù)組

2、時,可以這樣:typedefcharLine[81];Linetext,secondline;getline(text);同樣,可以象下面這樣隱藏指針語法:typedefchar*pstr;intmystrcmp(pstr,pstr);  這里將帶我們到達(dá)第一個typedef陷阱。標(biāo)準(zhǔn)函數(shù)strcmp()有兩個‘constchar*’類型的參數(shù)。因此,它可能會誤導(dǎo)人們象下面這樣聲明mystrcmp():intmystrcmp(constpstr,constpstr);  這是錯誤的,按照順序,‘constpstr’被解釋為‘char*const

3、’(一個指向char的常量指針),而不是‘constchar*’(指向常量char的指針)。這個問題很容易解決:typedefconstchar*cpstr;intmystrcmp(cpstr,cpstr);//現(xiàn)在是正確的記?。翰还苁裁磿r候,只要為指針聲明typedef,那么都要在最終的typedef名稱中加一個const,以使得該指針本身是常量,而不是對象。代碼簡化  上面討論的typedef行為有點像#define宏,用其實際類型替代同義字。不同點是typedef在編譯時被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。例如:type

4、defint(*PF)(constchar*,constchar*);  這個聲明引入了PF類型作為函數(shù)指針的同義字,該函數(shù)有兩個constchar*類型的參數(shù)以及一個int類型的返回值。如果要使用下列形式的函數(shù)聲明,那么上述這個typedef是不可或缺的:PFRegister(PFpf);  Register()的參數(shù)是一個PF類型的回調(diào)函數(shù),返回某個函數(shù)的地址,其署名與先前注冊的名字相同。做一次深呼吸。下面我展示一下如果不用typedef,我們是如何實現(xiàn)這個聲明的:int(*Register(int(*pf)(constchar*,cons

5、tchar*)))(constchar*,constchar*);  很少有程序員理解它是什么意思,更不用說這種費解的代碼所帶來的出錯風(fēng)險了。顯然,這里使用typedef不是一種特權(quán),而是一種必需。持懷疑態(tài)度的人可能會問:“OK,有人還會寫這樣的代碼嗎?”,快速瀏覽一下揭示signal()函數(shù)的頭文件,一個有同樣接口的函數(shù)。typedef和存儲類關(guān)鍵字(storageclassspecifier)  這種說法是不是有點令人驚訝,typedef就像auto,extern,mutable,static,和register一樣,是一個

6、存儲類關(guān)鍵字。這并是說typedef會真正影響對象的存儲特性;它只是說在語句構(gòu)成上,typedef聲明看起來象static,extern等類型的變量聲明。下面將帶到第二個陷阱:typedefregisterintFAST_COUNTER;//錯誤  編譯通不過。問題出在你不能在聲明中有多個存儲類關(guān)鍵字。因為符號typedef已經(jīng)占據(jù)了存儲類關(guān)鍵字的位置,在typedef聲明中不能用register(或任何其它存儲類關(guān)鍵字)。促進(jìn)跨平臺開發(fā)  typedef有另外一個重要的用途,那就是定義機器無關(guān)的類型,例如,你可以定義一個叫REAL的浮點類型,

7、在目標(biāo)機器上它可以i獲得最高的精度:typedeflongdoubleREAL;在不支持longdouble的機器上,該typedef看起來會是下面這樣:typedefdoubleREAL;并且,在連double都不支持的機器上,該typedef看起來會是這樣:、typedeffloatREAL;  你不用對源代碼做任何修改,便可以在每一種平臺上編譯這個使用REAL類型的應(yīng)用程序。唯一要改的是typedef本身。在大多數(shù)情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現(xiàn)。不是嗎?標(biāo)準(zhǔn)庫廣泛地使用typedef來創(chuàng)建這樣的平臺無關(guān)類

8、型:size_t,ptrdiff和fpos_t就是其中的例子。此外,象std::string和std::ofstream這樣的typedef還隱藏了長

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。