資源描述:
《typedef與define比較》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、typedef與define比較1、typedef和definetypedef在編譯時(shí)被解釋,define在預(yù)處理時(shí)被替換。#define定義“可讀”的常量以及一些宏語句的任務(wù),而typedef則常用來定義關(guān)鍵字、冗長的類型的別名。宏定義只是簡單的字符串代換(原地?cái)U(kuò)展),而typedef則不是原地?cái)U(kuò)展,它的新名字具有一定的封裝性,以致于新命名的標(biāo)識符具有更易定義變量的功能。typedefintsize;#defineMAX1002、typedef屬于存儲類聲明說明符typedefintsize是一個(gè)完整的聲明
2、,不可拆分,不能簡單的看作這個(gè)語句的意思是替int起一個(gè)別名為size。3、typedef編譯時(shí)做的事typedefintsize;sizelength;對sizelength;這條語句來說,在編譯時(shí)不是把其中的“size”替換為“int”,真實(shí)過程應(yīng)該是這樣的:1、length聲明為一個(gè)size類型。2、typedef語句后面部分中的語句(即intsize)相當(dāng)于一個(gè)一元表達(dá)式,其中的size是一個(gè)未知數(shù),現(xiàn)在要用length去代入這個(gè)一元表達(dá)式得到intlength,然后用這個(gè)替換得到的一元表達(dá)式取代si
3、zelength。3、1和2過程重復(fù),直至一元函數(shù)中沒有未知數(shù)。4、最終得到intlength??赡軓纳厦孢@個(gè)簡單的語句解釋不足以說清我的理解思路,我們看一個(gè)復(fù)雜點(diǎn)的:typedefint(*PF)(constchar*,constchar*);PFRegister(PFpf);對PFRegister(PFpf);這條語句來說,在編譯時(shí)它的過程應(yīng)該是這樣的:1、Register(PFpf)聲明為PF類型。2、typedef語句后面部分中的語句(即int(*PF)(constchar*,constchar*))
4、相當(dāng)于一個(gè)一元表達(dá)式,其中的PF是一個(gè)未知數(shù),現(xiàn)在要用Register(PFpf)去代入這個(gè)一元表達(dá)式得到int(*Register(PFpf))(constchar*,constchar*)),然后用這個(gè)替換得到的一元表達(dá)式取代PFRegister(PFpf)。3、1和2過程重復(fù),直至一元函數(shù)中沒有未知數(shù)。4、最終得到int(*Register(int(*pf)(constchar*,constchar*)))(constchar*,constchar*)。其中過程3的詳細(xì)過程:pf聲明為PF類型。type
5、def語句后面部分中的語句(即int(*PF)(constchar*,constchar*))相當(dāng)于一個(gè)一元表達(dá)式,其中的PF是一個(gè)未知數(shù),現(xiàn)在要用pf去代入這個(gè)一元表達(dá)式得到int(*pf)(constchar*,constchar*)),然后用這個(gè)替換得到的一元表達(dá)式取代PFpf。得到int(*Register(int(*pf)(constchar*,constchar*)))(constchar*,constchar*)。#define的作用在C或C++語言源程序中允許用一個(gè)標(biāo)識符來表示一個(gè)字符串,稱為
6、“宏”。被定義為“宏”的標(biāo)識符稱為“宏名”。在編譯預(yù)處理時(shí),對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動完成的。在C或C++語言中,“宏”分為有參數(shù)和無參數(shù)兩種。無參宏定義 無參宏定義的一般形式為:#define宏名字符串 無參宏的宏名后不帶參數(shù)?! ∑涠x的一般形式為:#define標(biāo)識符字符串 其中的“#”表示這是一條預(yù)處理命令。凡是以“#”開頭的均為預(yù)處理命令?!癲efine”為宏定義命令?!?/p>
7、標(biāo)識符”為所定義的宏名?!白址笨梢允浅?shù)、表達(dá)式、格式串等?! ±纾骸?defineM(a+b) 它的作用是指定標(biāo)識符M來代替表達(dá)式(a+b)。在編寫源程序時(shí),所有的(a+b)都可由M代替,而對源程序作編譯時(shí),將先由預(yù)處理程序進(jìn)行宏代換,即用(a+b)表達(dá)式去置換所有的宏名M,然后再進(jìn)行編譯?! 〕绦?: #defineM(a+b) intmain() { ints,y; printf("inputanumber:"); scanf("%d",&y); s=M*M; printf("s=
8、%d",s); } 上例程序中首先進(jìn)行宏定義,定義M來替代表達(dá)式(a+b),在s=M*M中作了宏調(diào)用。在預(yù)處理時(shí)經(jīng)宏展開后該語句變?yōu)椋篠=(a+b)*(a+b)但要注意的是,在宏定義中表達(dá)式(a+b)兩邊的括號不能少。否則會發(fā)生錯(cuò)誤。如當(dāng)作以下定義后:#defineM(a)+(b)在宏展開時(shí)將得到下述語句:S=(a)+(b)*(a)+(b) 對于宏定義還要說明以下幾點(diǎn): 1.宏定義是用宏