typedef用法和陷阱_第1頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、typedef用法和陷阱typedef使用和陷阱一、typedef的使用1.用typedef來聲明新的類型名,來代替已有的類型名,也就是給類型起別號。比如1 typedef float real; /用real來代表float類型2 real a; /定義一個real類型的變量,等價于float a,即定義一個float類型的變量a這種使用常常用來作為定義與平臺無關(guān)的類型,便利代碼的跨平臺移植。例如,定義real類型為目標(biāo)平臺精度最高的類型。1在支持long double的平臺上定義為:typedef long double real;注:long double為c99增強(qiáng)的類型,ansi c

2、標(biāo)準(zhǔn)規(guī)定了double變量存儲為 ieee 64 位(8 個字節(jié))浮點(diǎn)數(shù)值,但并未規(guī)定long double確實(shí)切精度,但規(guī)定long double的精度不少于double的精度。所以對于不同平臺long double可能有不同的實(shí)現(xiàn),有的是8字節(jié),有的是10字節(jié),有的是12字節(jié)或16字節(jié)。關(guān)于詳細(xì)的編譯器的狀況, 可以通過 sizeof(long double)得知。2在不支持long double的平臺上改為typedef double real;3在double不支持的平臺上改為typedef float real;因此,當(dāng)跨平臺時,只要改下 typedef 本身就行,不用對其他源碼做任

3、何修改。2.為自定義數(shù)據(jù)結(jié)構(gòu)(如struct、union)定義簡潔易記的類型名。比如:struct data int month; int day; int year; ; /定義一個data的結(jié)構(gòu)體聲明結(jié)構(gòu)體變量時,代碼如下struct data birthday; 用typedef可以定義新的類型,代替上面的結(jié)構(gòu)體類型typedef struct data int month; int day; int year; data; /定義一個data的結(jié)構(gòu)體data birthday; /定義一個data類型的變量birthday,等價于上面struct data類型注:這種辦法在一些代碼規(guī)范

4、中是不推舉和禁止的,由于新的類型躲藏了詳細(xì)的類型,不利于看代碼的人直觀了解到實(shí)際類型。3.用typedef來聲明新的類型1可以用來簡化數(shù)組變量定義typedef int arr10; /定義類型arr為含有10個元素的int數(shù)組arr arr_a, arr_b; /定義了兩個含有10個元素的int數(shù)組變量arr_a,arr_b2簡化指針變量的定義typedef int* int_pint_p p1,p2; /定義兩個int指針變量p1、p2注重,下面的定義簡單引起錯誤,所以編程規(guī)范中禁止一次聲明多個變量int* p1, p2; /p1為int*類型,p2為int類型1 typedef char

5、* string;2 strint p; /p為字符串指針變量3 strint s10; /s為指針數(shù)組,即s為一個含有10個元素的數(shù)組,每個元素是一個字符串指針45 typedef int (* pointer)(); /聲明pointter為指向函數(shù)的指針類型,該函數(shù)返回值為int類型6 pointer p1,p2; /p1,p2均為函數(shù)指針變量;4.為復(fù)雜的聲明定義一個新的容易的別號。int *(*a5)(int, char*); /變量名為a,挺直用一個新別號pfun替換atypedef int *(*pfun)(int, char*);pfun a5; /定義一個含有5個函數(shù)指針的數(shù)

6、組void (*b10) (void (*)(); /原聲明,b為含有10個元素的函數(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為指針,該指針指向一個數(shù)組,該數(shù)組含有9個元素,每個元素為一個函數(shù)指針,該函數(shù)指針的返回值為double類型2 簡化寫法:3 typedef double(*pfuny)(); /聲明一個函數(shù)指

7、針別號pfuny,返回類型為double4 typedef pfuny (*pfunparamy)9; /聲明一個指針5 pfunparamy e;/聲明變量e為pfunparamy類型理解復(fù)雜聲明可用的右左法則:從變量名看起,先往右,再往左,遇到一個圓括號就調(diào)轉(zhuǎn)閱讀的方向;括號內(nèi)分析完就跳出括號,還是按先右后左的挨次,如此循環(huán),直到囫圇聲明分析完。舉例:int (*func)(int *p);首先找到變量名func,外面有一對圓括號,而且左邊是一個*號,這解釋func是一個指針;然后跳出這個圓括號,先看右邊,又碰到圓括號,這解釋(*func)是一個函數(shù),所以func是一個指向這類函數(shù)的指針,

8、即函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值類型是int。int (*func5)(int *);func右邊是一個運(yùn)算符,解釋func是具有5個元素的數(shù)組;func的左邊有一個*,解釋func的元素是指針(注重這里的*不是修飾func,而是修飾func5的,緣由是運(yùn)算符優(yōu)先級比*高,func先跟結(jié)合)。跳出這個括號,看右邊,又碰到圓括號,解釋func數(shù)組的元素是函數(shù)類型的指針,它指向的函數(shù)具有int*類型的形參,返回值類型為int。也可以記住2個模式: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 是用來聲明一種新的類型,它不同于宏,不是容易的字符串替換。string已經(jīng)是一種類型,const修改該類型為常量。因此,const string中的 const 賦予了string常量屬性,也就是囫圇指針本身常量性,也即形成了常量指針char*const(一個指向char的常量指針)。即它事實(shí)上相當(dāng)于char*const,而不是const char*(指向常量 char 的指針)。固然,要想讓 const pchar 相當(dāng)于 const char* 也很簡單,如下面的代碼所示: typedef const char* pchar;int strcmp(pchar, pchar); 因此,無論什么時候,只要為指針聲明 typedef,那么就應(yīng)當(dāng)在終于的 typedef 名稱中加一個 const,以使得該指針本身是常量。2.typedef 和存儲類關(guān)鍵字(storage c

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論