c語言基礎(chǔ)教程第六章預(yù)處理功能和類型定義_第1頁
c語言基礎(chǔ)教程第六章預(yù)處理功能和類型定義_第2頁
c語言基礎(chǔ)教程第六章預(yù)處理功能和類型定義_第3頁
c語言基礎(chǔ)教程第六章預(yù)處理功能和類型定義_第4頁
c語言基礎(chǔ)教程第六章預(yù)處理功能和類型定義_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第六章預(yù)處理功能和類型定義6. 1 預(yù)處理功能概述 本節(jié)主要講述預(yù)處理功能的特點。 預(yù)處理功能是由很多預(yù)處理命令組成,這些命令將在編譯時進行通常的編譯功能包含詞法和語法分析、代碼生成、優(yōu)化等之前進行處理,故稱為預(yù)處理.預(yù)處理后的結(jié)果和源程序一起再進行通常的編譯操作,進而得到目標(biāo)代碼。 預(yù)處理功能主要包括如下三種;宏定義、文件包含和條件編譯。 這些功能是通過相應(yīng)的宏定義命令、文件包含命令和條件編譯命令來實現(xiàn)。這些命令不同于C語言的語句,因為它們具有如下的特點: (1)多數(shù)預(yù)處理命令只是一種替代的功能,這種替代是簡單的替換,而不進行語法檢查。 (2)預(yù)處理命令都是在通常的編譯之前進行的,編譯時已經(jīng)

2、執(zhí)行完了預(yù)處理命令,即對預(yù)處理后的結(jié)果進行編譯,這時進行詞法和語法分析等通常的程序編譯。 (3)預(yù)處理命令后面不加分號,這也是在形式_七與語句的區(qū)別。 (4)為了使預(yù)處理命令與一般C語言語句相區(qū)別,凡是預(yù)處理命令都以井號(#)開頭。 (5)多數(shù)預(yù)處理命令根據(jù)它的功能而被放在文件開頭為宜,但是根據(jù)需要,也可以放到文件的其他位置。不要產(chǎn)生錯覺,好像所有的預(yù)處理命令都必須放在文件開頭。 學(xué)習(xí)和掌握預(yù)處理功能時,應(yīng)該了解它的上述規(guī)定,以便正確地使用和理解這些預(yù)處理命令。6.2.1 簡單宏定義1.簡單宏定義的格式和功能 簡單宏定義的格式如下: #define標(biāo)識符)(字符串 其中,define是關(guān)鍵字,

3、它表示該命令為宏定義,悅標(biāo)識符)是宏名,它的寫法同標(biāo)識符。用來表示所代表的字符串。 簡單宏定義是定義一個標(biāo)識符(宏名)來代表一個字符串。 前面講過的符號常量就是用這種簡單宏定義來實現(xiàn)的。例如: #define PI 3. 這是一條宏定義的命令,它的作用是用指定的標(biāo)識符PI來代替字符串3.在程序中出現(xiàn)的是PI,在編譯前預(yù)處理時,將所有的PI都用3. 來代替,即使用宏名來代替指定的字符串。這一過程又稱為宏替換或稱為宏展開.例6.1給出半徑求圓的面積。 執(zhí)行該程序,出現(xiàn)如下信息:#dfine PI 3.main ( ) fioat r, s, Printf(Input radius;) scanf(

4、%f,&r); A=PI *r*rPrintf(:a=%.4fn:,a);執(zhí)行該程序,出現(xiàn)如下信息:Input radius; 5 輸出結(jié)果如下 s=78. 5398 說明:該例中,開始率義了符號常量PI,它是用宏定義來實現(xiàn)的。程序中出現(xiàn)的PI,在編譯前預(yù)處理時將用3.來替換。 2.使用簡單宏定義時的注意事項 (1)宏定義中的標(biāo)識符)(即宏名)一般習(xí)慣用大寫字母,以便與變量名區(qū)別。這樣。在C語言程序的各表達式語句中,凡是大寫字母的標(biāo)識符(指全部大寫字母)一般是符號常量。但是,宏定義中的宏名也可以用小寫字母。 (2)宏定義是預(yù)處理功能中的一種命令,它不是語句。因此。行末不需加分號。如果加了分號,

5、則該分號將作為所定義的字符串的一部分,即按字符串的一部分來處理。 (3)宏替換是一種簡單的代替,替換時不作語法檢查。如果所定義的字符申中有錯,例如,將數(shù)字。,誤寫為字母。,預(yù)處理照樣代換,并不報錯,而在編譯中進行語法檢查時才報錯。因此,要記住宏替換操作只是簡單的代換,用宏定義時的字符串來替換其宏名。 (4)宏定義中宏名的作用域為定義該命令的文件中,并從定義時起,到終止宏定義命令( #undef() 其甲,是標(biāo)識符,一般習(xí)慣上用大寫字母,是由一個或多個參數(shù)組成的,多個參數(shù)之間用逗號分隔;(宏體)是一個字符串,其中包含中所指定的參數(shù),它可以是由若干個語句組成的。該命令末尾一般不加分號。 帶參數(shù)的宏

6、定義在宏替換時。不是簡單的用宏體替換宏名,而是用實參替換形參.這里所說的實參是指程序中引用宏名的參數(shù),而形參是指宏定義時,宏名后邊參數(shù)表中的參數(shù)。 例如, #define sQ(x)x*x 在程序中出現(xiàn)下述語句: A=SQ(5); 這里,在宏定義中參數(shù)x是形參,而程序中SQ(5)的S是實參,宏替換時,將用5來替換x,其結(jié)果如下: a=5 * 5; 又例如, #define ADD(x,y) x十Y 在程序中出現(xiàn)下述語句; A=ADD(5,3); 宏替換后結(jié)果如下: a=5十3; 如果在上述宏定義下,程序中出現(xiàn)如下語句; b=ADD(a+1,b一1); 宏替換后結(jié)果如下: B=a+1+b-1 由

7、此可見,帶參數(shù)的宏定義是這樣替換的:按照宏定義中所指定的宏體從左至右用程序中出現(xiàn)的宏的實參來替換宏體中的形參,對非參數(shù)字符,則保留。宏中的實參可以是常量、變量或表達式。2.使用帶參數(shù)的宏定義應(yīng)該注意的事項 (1)在宏定義時,宏名與左圓括號之間不能出現(xiàn)空格符,否則空格符后將作為宏體的一部分。例如: #define ADD (x,y) x十Y 將認為ADD是不帶參數(shù)的宏名,而字符串(x, y) x+y作為宏體。顯然,這不是原來的含意。因此,宏名后與左圓括號間一定不能加空格符。 (2)宏體中,各參數(shù)上加括號是十分重要的。例如: #define SQ(x) x*x 當(dāng)程序中出現(xiàn)下列語句, A=SQ(a

8、十1); 替換后,則為; a=a+1*a+1 而不能將替換的結(jié)果寫成 a=(a十1)*(a+1); 如果要將替換后結(jié)果寫成上述形式,則需要將宏定義改寫為: #define SQ(x) (x),(x) 由此可見,在宏定義中,對宏體內(nèi)的形參外向加上括號是很重要的,它可以避免在優(yōu)先級上可能出現(xiàn)的問題。 對上述宏定義最好寫成下述形式: #define SQ(x)(.x)*(x ) 這里的圓括號是很有用的。例如,在有如下語句時, m=50/SQ(b十1); 替換后結(jié)果如下: m= 50/(b十1)*(b+1); (3)帶參數(shù)的宏定義與函數(shù)的區(qū)別 帶參數(shù)的宏定義和函數(shù)盡管在形式上非常相似,特別是當(dāng)宏名使用

9、小寫字母時,出現(xiàn)在程序中很難區(qū)別出來是帶參數(shù)的宏定義還是函數(shù)。但是,這二者是根本不同,它們之間的區(qū)別概述如下: 定義形式上不同。帶參數(shù)的宏定義的定義格式前面講過了,它是通過預(yù)處理命令ce-fine來定義的。它的作用域是在定義它的文件內(nèi),并從定義處開始。而函數(shù)的定義格式在本書函數(shù)和存儲類1章中描述過了。它的作用域分為程序級的和文件級的兩種。 處理時間上不同。宏定義是在編譯預(yù)處理時處理的,處理后再進行編譯。而函數(shù)是在執(zhí)行時處理的。它們二者占用的是不同階段的時間。 處理方式_卜。不同。帶參數(shù)的宏定義在進行宏替換時,用實參來代替形參,這里只是簡單替換,并不做語法上的檢查。而函數(shù)調(diào)用時,是將實參的值賦給

10、形參,要求對應(yīng)類型一致。宏定義中在參數(shù)替換時,不要求類型一致仁 時間和空間的開銷上不同。帶參數(shù)的宏定義,是在通常的編譯之前完成替換的,因此它在該程序的目標(biāo)代碼的形成上并沒有影響。函數(shù)調(diào)用是在執(zhí)行時進行的,因此,采用函數(shù)調(diào)用的方式可以減少該程序的目標(biāo)代碼,所以,在空間的開銷上可以減少。但是,函數(shù)調(diào)用要有額外的時間上的開銷。因為調(diào)用前要保留現(xiàn)場,調(diào)用后又要恢復(fù)現(xiàn)場,因此函數(shù)調(diào)用時間開銷要比帶參數(shù)的宏定義大。帶參數(shù)宏定義在使用中比函數(shù)時間開銷小是一個重要特征。 類型的要求上不同。帶參數(shù)的宏定義對形參的類型不必說明,它沒有類型的限制。而函數(shù)的形參在定義時必須進行類型說明。例如,兩個數(shù)相減的操作用帶參數(shù)

11、的宏定義和函數(shù)分別定義如下: 用帶參數(shù)的宏定義格式如下: 抹define MINU (x,y)(x)一(Y) 用函數(shù)的定義格式如下: minu(x,y) Int x,y ( return (x一y); 該函數(shù)只能進行兩個lnl型數(shù)值相減的運算。而。上述的宏定義可以進行兩個。har型量的相減,也可以進行兩個int型數(shù)的相減。還可以進行兩float型數(shù)的相減,因為它沒有類型的限制通過上述對于帶參數(shù)的宏定義和函數(shù)之間區(qū)別的分析,不難看出兩者各有特點。對于同一個間題一可以采用兩種不同的表示形式,那么到底選擇哪一種更好些呢?一般說來,在功能比較簡單的情況一下,選用帶參數(shù)的玄定義能更好些,特別是在需要反復(fù)

12、引用的情況下,用宏定義的時間開銷較少。例如,比較兩個整數(shù)的大小,并輸出最大的,可用如下的宏定義來實現(xiàn): #define fl(a,b)printf(%dn,ab?;b); 又例如,計算一個自然數(shù)的立方值,可用如下的宏定義實現(xiàn): #define f2(a)printi%dn,a*a*a); 功能比較復(fù)雜的還是選用函數(shù)來定義。6.2.3 宏定義的應(yīng)用 在C語言程序中,宏定義主要用于下述幾個方面。 (1)符號常聳的定義 C語言中的常覺一般都用符號常量表示,這樣不僅書寫簡便,而且易于修改、易于移植,還可以使標(biāo)識符有更明顯的含意。例如, #define PI 3. #define E 2.71828 #

13、define EPS 1.0e一9 #define MAX 32767 #define TRUE 1 #define FALSE 0 等等。 (2)功能簡單使用頻繁的情況卜,用帶參數(shù)的宏定義比用函數(shù)可以提高速度。因為函數(shù)調(diào)用要花費額外的時間開銷。 (3)在多數(shù)情況下,為了書寫簡練,程序易讀而采用宏定義例6.4分析下列程序輸出結(jié)果,并說明宏定義在該程序中所起的作用。 #define F1%dn #define F2%d,%dn #define PRl(a)print3(1,a) #define PR2t(a.b) print(F2,a,b); main) int x+y,z; x=5; y=5*

14、x; z=x*y; PR1(x); PR2(y,z); PR1(2,y); PR2(x+5,z/5) 執(zhí)行該程序輸出的結(jié)果如下: 5 25.30 50 10.6 說明: (1)該程序前面有4條宏定義命令。前兩條是簡單宏定義,后兩條是帶參數(shù)的宏定義。這4條宏定義命令都是有關(guān)標(biāo)準(zhǔn)文件的格式輸出的。 (2)程序中的最后4條語句是輸出顯示結(jié)果的語句,由于引用了宏定義命令,使得該輸出語句簡練、清晰。由于在C語言程序中,輸出顯示結(jié)果語句用得較多,并且可選用不同的參數(shù)個數(shù),如果能使用宏定義命令使之簡化,將給書寫帶來方便。特別是這里使用一次文件包含命令(下面講述)將宏定義部分寫在一個。h(頭文件)文件內(nèi),程序

15、需要時只要包含進去就可以了,這樣將會更加簡便。6.3.1 文件包含命令的格式和功能 文件包含命令是C語言程序常用的一條預(yù)處理命令,它的格式如下: # include(文件名) 其中,include是關(guān)鍵字,(文件名)是被包含的文件名,這里要求使用文件全名,包括路徑名和擴展名。 文件包含的功能就是將指定的被包含文件的內(nèi)容放置在文件包含命令出現(xiàn)的地方。該命令可寫在程序的任一位置,但是一般寫在一個文件的開頭,這是一種明智的選擇。因為該命令在何處出現(xiàn),所包含的文件內(nèi)容就被放置到該命令出現(xiàn)的位置,這就相當(dāng)于將被包含文件的內(nèi)容插入到該命令的地方。而被包含的。h文件中往往是一些該程序所需要的一些說明或定義,

16、它包括符號常量的定義、類型定義、帶參數(shù)的宏定義、數(shù)組、結(jié)構(gòu)、聯(lián)合和枚舉的定義等等,它還可以包含外部變量的定義、函數(shù)的定義和說明等等。這些內(nèi)容程序中將要用到,顯然放在程序前面比放在中間和后面要好些。 文件包含的用途在于減少程序人員的重復(fù)勞動,使得C語言程序更加簡潔,提高程序的可讀性。但是,如果對文件包含命令使用不當(dāng),會增加程序的代碼長度,包含了一些該程序所不需要的內(nèi)容。因此,選擇包含的文件時要慎重,定義被包含的文件時要短小。 6. 5 將例6. 4中的宏定義部分寫在一個print.h文件中,當(dāng)程序需要時,將它包含進去。其做法如下: 定義。h文件名為print.h,它將包含有關(guān)輸出顯示結(jié)果的宏定義

17、,其內(nèi)容如下: #define F1%dn #define F2%d,I%dn #de,ine PR1(a)printf(Fl,a) #define PR2(a,b) printf(F2,a,b) 程序內(nèi)容如下 #include print.h Main() int x,y,z; X=5; y=5*x: z =x+y; PR1(x); PR2(y,Z); PR12,Y); PR2(x+5,z/5) 執(zhí)行該程序的輸出結(jié)果與例6. 4的結(jié)果相同。 該程序中在開頭使用了文件包含命令,將文件print.h包含在該程序的開頭。從程序書寫角度來看只使用了一條文件包含命令便可代替該文件(指print. h文

18、件)中的4條宏定義命令,可見書寫簡單了。print. h文件還可以用于其他程序中,如果某個程序需要該文件的內(nèi)容,只要使用一條文件包含命令就可以了。 6.3.2使用文件包含命令時應(yīng)注意事項、 (1)一個文件包含命令只能包含一個文件。如果某個程序需要包含多個文件,則可使用多條文件包含命令。例如,下列寫法是錯誤的, #includ xy. h mn. h 而改寫成下列形式是正確的, #includexy. h #includemn. h 其前后順序取決于被包含文件內(nèi)容間的相互關(guān)系。如果兩個被包含文件內(nèi)容相互無關(guān),則書寫的前后順序也無關(guān)。如果一個文件中要使用另一個文件的內(nèi)容,則另一個文件要寫在前面。

19、(2)文件包含的定義是可以嵌套的。所謂文件包含定義的嵌套是指在一個被包含的文件中還可以包含有其他文件。例如, 文件filel. c的內(nèi)容如下: #include filet. h 而被包含的文件#file2.h的內(nèi)容如一下: #include file3. h 這便是文件包含的嵌套,它可以等價于: 文件filet c的內(nèi)容如下: #include,file3. h #includefile2. h 按上述順序?qū)懕容^安全。 (3) 文件包含命令中,引用的被包含文件有下面兩種方式: 方式一: # include(文件名 方式二: # include文件名, 這兩種方式中,文件名都要求是全名,方式一

20、中用一對尖括號將文件名括起,它表示所引習(xí)的被包含文件是系統(tǒng)提供的,并放在指定目錄下的。h文件。例如, #include stdio. h) #include math. h) 等等。 這種方式引用時,系統(tǒng)將到指定的目錄去查找系統(tǒng)提供的。h文件。 方式二是用一對雙引號將文件名括起,它表示所引用的被包含文件可能是用戶自己定義的文件,并放在當(dāng)前目錄下或系統(tǒng)可自動查找的目錄下。對這種引用的文件,系統(tǒng)先在當(dāng)前目錄下或用nos命令(PATH)連起來的通用目錄下查找,如果找不到再到系統(tǒng)指定的目錄下查找?guī)б虼?,要求編程人員對自己定義的被包含文件,引用時使用雙引號,而系統(tǒng)提供的。h文件最好使用尖括號,這樣查找可

21、能快些。 (4)被包含的文件可以是任意的源文件,不一定必須是。h文件,也可以是。c文件, 例6.6 使用文件包含命令將一個。c文件包含在另一個。c文件之中。 f1. c文件內(nèi)容如下: add(x,y int x,y; int z; z =x+y; return(z); f2.c文件內(nèi)容如下: #Include fl.c main () int a,b; a=5; b=10; printf( %dn,add (a,): 執(zhí)行f2一文件后,將獲得如h結(jié)果: 15 在f2.c文件的開頭就使用文件包含命令將f1.c一文件包含了進去,這就相當(dāng)于將fl.c文件的內(nèi)容插入到f2. c文件中main( )的前

22、邊。 (5)為提高程序的可移植性,編程時事先將一些在不同環(huán)境或條件廠需要修改的量或需要修改的部分放在一個被包含的文件中,以后為適應(yīng)某種環(huán)境需要修改時??梢灾恍薷陌募械膬?nèi)容,這將為該程序的移植提供了方便。 6.4.1條件編譯的常用命令格式 條件編譯的常用命令格式有如下三種。 格式一: #ifdef #else #endif 其中,ifdef,else和endif是關(guān)鍵字。(標(biāo)識符少是指是否使用 defin命令定義過。和是由語句或命令組成的程序段。 該格式的功能描述如下; 當(dāng)被宏定義時,中的語句或命令參加編譯;否則程序段2)中的語句或命令參加編譯,該格式中,#else是可以省略的,則變成下列

23、格式: #ifdef (程序段) #endif 格式二: #ifndef #else #endif 該格式與格式一大致相同,只是第一個關(guān)鍵字中不一樣。 該格式的功能是:如果未被宏定義時,則編譯。否則編譯 格式三: #if表達式) #else #endif 該格式中,第一行與前面二種格式不同,if是關(guān)鍵字,是常量表達式。 該格式的功能是:當(dāng)是有非0值時,則參加編譯;否則參加編譯。當(dāng)#else省略了,則變成如下簡化格式; #if #endif 該格式中決定參加編譯的程序段取決于的值是零還是非零。 以下三種格式可根據(jù)需要講行選擇。6.4.2 條件編譯命令的應(yīng)用 (1)條件編譯可以用來提高程序的通用性

24、。由于不同的計算機存在一定差異,有的是16位機,有的是32位機,為使一個源程序在不同機器上運行,可以使用以下的條件編譯(假定區(qū)別僅在機器的字長上): #ifdef PC16 #define INTSIZE 16 #else #define INTSiE 32 #endif 如果PCi6在前面已被宏定義過,例如以下命令: #define PC16 16 則編譯下面的命令行: #define INTSIZE 16 否則,PC16在前面沒有被宏定義過,則編譯下面的命令行: #define INTIZE 32 這里,到底編譯哪些行,關(guān)鍵在于標(biāo)識符PC16是否被宏定義,而定義為多少并沒有關(guān)系。 前面介紹

25、的只是一種簡單情況,其思路是將其不同用語句或命令表示出來,根據(jù)不同的要求進行選擇,按照這種思路來設(shè)計條件編譯。 (2)條件編譯會給程序調(diào)試帶來方便。在源程序的調(diào)試中,常常需要跟蹤程序的執(zhí)行情況,為此,在程序中加一些輸出信息的語句,通過這些輸出信息來跟蹤判斷程序是否有錯誤。這是一種常用的調(diào)試手段。在調(diào)試結(jié)束后,需要把為了調(diào)試而增加的那些輸出信息的語句刪除掉,然而這種刪除工作常常帶來一些不方便,因為不能多刪,也不對能少刪,必須刪對,否則又將出錯。如果使用條件編譯將會帶來一些方便即在滿足調(diào)試條件的情況下,加上一些輸入信息的語句行,在調(diào)試完成后,只要改變其條件使之不滿足調(diào)試條件,這時再重新編譯,原來加

26、進去的一些輸出信息的語句將不再被編譯,這相當(dāng)于被刪除了,這種自動刪除要方便得多。例如,在調(diào)試某個程序時,為得出輸出信息以供判斷可在源程序中插入以下條件編譯: #if DEBUG printf(a=%d,b=%dn,a,b) #endif 在調(diào)試程序時,在它們前面設(shè)置#define DEBUG 1,則printf( )語句行將參加編譯。于是 將輸出供判斷參考的a和b的滇。當(dāng)調(diào)試完成后,只是將前面的設(shè)置修改為:# define DE-BUG 0,則printf ( )語句行將不參加編譯,就相當(dāng)于該行被刪除一樣??梢?,使用條件編譯通過改變其條件來刪除不需要參加編譯的程序段是很方便的。 (3)使用條件

27、編譯替代if語句會減少目標(biāo)代碼的長度。例6.7將一個已知的十進制數(shù),根據(jù)設(shè)置條件編譯的不同條件,使它按十六進制輸出,或按八進制輸出。 導(dǎo)人1s/、JL巾7相組l月它 main() . #define ;N 1; int n55; #ifdef N primF( % xn ,n); #else printf (%0n,n); #endif 由于程序中,N已被宏定義,因此執(zhí)行搞程序輸出的結(jié)果如下: 37 這是55 的十六進制表示的值 如果刪除程序中的#definen NI這行后,執(zhí)行該程序輸出的結(jié)果為55的八進制表示值: 67 前面己經(jīng)講述了三種常用的驪處理命令:宏定義命令、文件包含命令和條件編譯

28、命令。此外,還有一些其他不常用的預(yù)處理命令木書就不再講述了。下面以一個使用上述三種預(yù)處理命令的程序來結(jié)束本節(jié)的內(nèi)容。例6.8分析下列程序的輸出。n果,并分析各種預(yù)處理命令的用法。 該程序內(nèi)容如下: #define N I #define ARC main()printf(Hello!%sn) #include abc.h 其中,abc.H文件的內(nèi)容如下: #if N Char s=good morning ABC #endif 執(zhí)行該程序后輸出結(jié)果為: Hello!Good morning! 說明: (1)在該程序中,有兩條宏定義命令,都是簡單宏定義,有一條文件包含命令,所包含的文件是用戶定義

29、的。 (2)在被包含的文件ab. h中,只有一個條件編譯命令,該命令表明,只要是N為非0,則給出的程序段將被編譯。如果N為0,則無編譯的程序段。 (3)在該程序編譯前,進行預(yù)處理時,先將被包含文件插人到包含文件命令處,再經(jīng)過進行條件編譯命令和宏定義命令后,該程序?qū)⒈惶鎿Q成如下待編譯的格式: Char s=good morning Main() Printf(*Hello!%sn,s); 該程序經(jīng)過編譯,執(zhí)行后將獲得上述結(jié)果,這是很自然的。6.5.1類型定義的含意和類型定義語1.類型定義的含意 什么是類型定義?是再定義新的類型嗎?不是口這里的類型定義指根據(jù)某種需要對已有的類型用一種新的類型名字來

30、替代,即給已有的或者已存在的類型起個新名。而不是再重新定義原來沒有的新類型。2.類型定義語句 類型定義是通過類型定義語句來實現(xiàn)的。類型定義語句格式如下: typedef(已有類型說明符)新類型名表; 其中,typedef是關(guān)鍵字。(已有類型說明符)包含C語言中規(guī)定的所有合法的類型說明符和已用類型定義語句定義的新的類型名,(新類型名表)是用類型定義語句定義的新的類型說明符,該表中可以有一個或多個新的類型說明符,多個新的類型說明符用逗號分隔。 該語句在使用時應(yīng)該往意如下事項: (1)該語句只是對已有的類型定義一個新名,而絕不是產(chǎn)生一種新的類型。 (2)使用該語句時,習(xí)慣上將新定義的類型名用大寫字母

31、,以便與系統(tǒng)原有的類型名加以區(qū)別。這里如用小寫字母也可以。 (3)類型定義可以嵌套。所謂嵌套是指用該語句定義的新的類型名可再用來定義新的類型。例如, typFdef int FEET; typedef FEET*()POINT; POINT p1,p2; 這里,F(xiàn)EET是用typedef語句定義出的新類型名,接著又用FEET來定義新類型POINT,由于FEET為int型的類型,而PONIT為指向整型類型的指針,然后又用POINT定義兩個變量p1和P2,這時p1和P2都是指向int型類型的指針。 (4)常把使用該語句定義的數(shù)據(jù)類型包含在某個頭文件中,這樣在不同的源文件中用到該類型時,叮使用文件包含命令將所需的頭文件包含到該源文件巾。 (5)在使用中會看到typedef語句與#define二有相似之處,但是二者實際上是很不相同的。其中#define在編譯的預(yù)處理時完成,只是簡單的替換,而typed

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論