
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、typedef用法和陷阱typedef使用和陷阱一、typedef的使用1.用typedef來(lái)聲明新的類型名,來(lái)代替已有的類型名,也就是給類型起別號(hào)。比如1 typedef float real; /用real來(lái)代表float類型2 real a; /定義一個(gè)real類型的變量,等價(jià)于float a,即定義一個(gè)float類型的變量a這種使用常常用來(lái)作為定義與平臺(tái)無(wú)關(guān)的類型,便利代碼的跨平臺(tái)移植。例如,定義real類型為目標(biāo)平臺(tái)精度最高的類型。1在支持long double的平臺(tái)上定義為:typedef long double real;注:long double為c99增強(qiáng)的類型,ansi c
2、標(biāo)準(zhǔn)規(guī)定了double變量存儲(chǔ)為 ieee 64 位(8 個(gè)字節(jié))浮點(diǎn)數(shù)值,但并未規(guī)定long double確實(shí)切精度,但規(guī)定long double的精度不少于double的精度。所以對(duì)于不同平臺(tái)long double可能有不同的實(shí)現(xiàn),有的是8字節(jié),有的是10字節(jié),有的是12字節(jié)或16字節(jié)。關(guān)于詳細(xì)的編譯器的狀況, 可以通過(guò) sizeof(long double)得知。2在不支持long double的平臺(tái)上改為typedef double real;3在double不支持的平臺(tái)上改為typedef float real;因此,當(dāng)跨平臺(tái)時(shí),只要改下 typedef 本身就行,不用對(duì)其他源碼做任
3、何修改。2.為自定義數(shù)據(jù)結(jié)構(gòu)(如struct、union)定義簡(jiǎn)潔易記的類型名。比如:struct data int month; int day; int year; ; /定義一個(gè)data的結(jié)構(gòu)體聲明結(jié)構(gòu)體變量時(shí),代碼如下struct data birthday; 用typedef可以定義新的類型,代替上面的結(jié)構(gòu)體類型typedef struct data int month; int day; int year; data; /定義一個(gè)data的結(jié)構(gòu)體data birthday; /定義一個(gè)data類型的變量birthday,等價(jià)于上面struct data類型注:這種辦法在一些代碼規(guī)范
4、中是不推舉和禁止的,由于新的類型躲藏了詳細(xì)的類型,不利于看代碼的人直觀了解到實(shí)際類型。3.用typedef來(lái)聲明新的類型1可以用來(lái)簡(jiǎn)化數(shù)組變量定義typedef int arr10; /定義類型arr為含有10個(gè)元素的int數(shù)組arr arr_a, arr_b; /定義了兩個(gè)含有10個(gè)元素的int數(shù)組變量arr_a,arr_b2簡(jiǎn)化指針變量的定義typedef int* int_pint_p p1,p2; /定義兩個(gè)int指針變量p1、p2注重,下面的定義簡(jiǎn)單引起錯(cuò)誤,所以編程規(guī)范中禁止一次聲明多個(gè)變量int* p1, p2; /p1為int*類型,p2為int類型1 typedef char
5、* string;2 strint p; /p為字符串指針變量3 strint s10; /s為指針數(shù)組,即s為一個(gè)含有10個(gè)元素的數(shù)組,每個(gè)元素是一個(gè)字符串指針45 typedef int (* pointer)(); /聲明pointter為指向函數(shù)的指針類型,該函數(shù)返回值為int類型6 pointer p1,p2; /p1,p2均為函數(shù)指針變量;4.為復(fù)雜的聲明定義一個(gè)新的容易的別號(hào)。int *(*a5)(int, char*); /變量名為a,挺直用一個(gè)新別號(hào)pfun替換atypedef int *(*pfun)(int, char*);pfun a5; /定義一個(gè)含有5個(gè)函數(shù)指針的數(shù)
6、組void (*b10) (void (*)(); /原聲明,b為含有10個(gè)元素的函數(shù)指針數(shù)組,其參數(shù)為不帶參數(shù)的函數(shù)指針typedef void (*pfunparam)();/聲明不帶參數(shù)的函數(shù)指針為類型pfunparamtypedef void (*pfunx)(pfunparam); /聲明pfunx為函數(shù)指針pfunx b10; /函數(shù)指針數(shù)組b1 doube(*)() (*e)9; /變量e為指針,該指針指向一個(gè)數(shù)組,該數(shù)組含有9個(gè)元素,每個(gè)元素為一個(gè)函數(shù)指針,該函數(shù)指針的返回值為double類型2 簡(jiǎn)化寫法:3 typedef double(*pfuny)(); /聲明一個(gè)函數(shù)指
7、針別號(hào)pfuny,返回類型為double4 typedef pfuny (*pfunparamy)9; /聲明一個(gè)指針5 pfunparamy e;/聲明變量e為pfunparamy類型理解復(fù)雜聲明可用的右左法則:從變量名看起,先往右,再往左,遇到一個(gè)圓括號(hào)就調(diào)轉(zhuǎn)閱讀的方向;括號(hào)內(nèi)分析完就跳出括號(hào),還是按先右后左的挨次,如此循環(huán),直到囫圇聲明分析完。舉例:int (*func)(int *p);首先找到變量名func,外面有一對(duì)圓括號(hào),而且左邊是一個(gè)*號(hào),這解釋func是一個(gè)指針;然后跳出這個(gè)圓括號(hào),先看右邊,又碰到圓括號(hào),這解釋(*func)是一個(gè)函數(shù),所以func是一個(gè)指向這類函數(shù)的指針,
8、即函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值類型是int。int (*func5)(int *);func右邊是一個(gè)運(yùn)算符,解釋func是具有5個(gè)元素的數(shù)組;func的左邊有一個(gè)*,解釋func的元素是指針(注重這里的*不是修飾func,而是修飾func5的,緣由是運(yùn)算符優(yōu)先級(jí)比*高,func先跟結(jié)合)。跳出這個(gè)括號(hào),看右邊,又碰到圓括號(hào),解釋func數(shù)組的元素是函數(shù)類型的指針,它指向的函數(shù)具有int*類型的形參,返回值類型為int。也可以記住2個(gè)模式:type (*)(.)函數(shù)指針type (*)數(shù)組指針二、typedef的陷阱1.typedef是一種新類型的聲明,不是容易的字符串替換
9、,不同于define例如: 1 typedef char* string;2 int strcmp(const string,const string); 在上面的代碼中,const string 是否相當(dāng)于 const char* 呢?答案是否定的,緣由很容易,typedef 是用來(lái)聲明一種新的類型,它不同于宏,不是容易的字符串替換。string已經(jīng)是一種類型,const修改該類型為常量。因此,const string中的 const 賦予了string常量屬性,也就是囫圇指針本身常量性,也即形成了常量指針char*const(一個(gè)指向char的常量指針)。即它事實(shí)上相當(dāng)于char*const,而不是const char*(指向常量 char 的指針)。固然,要想讓 const pchar 相當(dāng)于 const char* 也很簡(jiǎn)單,如下面的代碼所示: typedef const char* pchar;int strcmp(pchar, pchar); 因此,無(wú)論什么時(shí)候,只要為指針聲明 typedef,那么就應(yīng)當(dāng)在終于的 typedef 名稱中加一個(gè) const,以使得該指針本身是常量。2.typedef 和存儲(chǔ)類關(guān)鍵字(storage c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租車司機(jī)雇傭合同
- 公司勞動(dòng)合同主體變更工作流程
- 山林租賃合同
- 五金電料采購(gòu)合同
- 消防水鶴安裝工程協(xié)議書
- 產(chǎn)品攝影保密協(xié)議
- 手房購(gòu)房意向定金合同書
- 游戲開(kāi)發(fā)及運(yùn)營(yíng)授權(quán)協(xié)議
- 項(xiàng)目開(kāi)發(fā)季度工作總結(jié)與反思報(bào)告
- 北京房屋租賃合同電子版7篇
- 保密基本知識(shí)考試試題(100題含答案)
- 新聞攝影培訓(xùn)PPT
- 露天煤礦防治水管理制度
- 電工電子技術(shù)與技能 程周
- PANTONE潘通色卡C面顏色
- 中藥的性能課件
- 平行四邊形的性質(zhì)說(shuō)課課件- 人教版八年級(jí)數(shù)學(xué)下冊(cè)
- 2022新教科版科學(xué)六年級(jí)下冊(cè)全一冊(cè)全部課件(含32課)
- 《數(shù)學(xué)物理方程》全冊(cè)配套課件
- 《煤礦安全規(guī)程》專家解讀(詳細(xì)版)
- 招聘面試流程sop
評(píng)論
0/150
提交評(píng)論