//3.原類型不可帶有存儲(chǔ)類別
//typedef static int SI;//錯(cuò)誤,"指定的存儲(chǔ)類多于1個(gè)"
//typedef register int RI;//錯(cuò)誤同上
//4.原類型應(yīng)是一種類型,而不可是變量/對(duì)象
float f=0;//將f定義為變量
//typedef f FL;//錯(cuò)誤
//5.不宜重定義的類型
typedef const CON;//重定義const
//CON int a=0;//但該類型無法正常使用
typedef unsigned US;//重定義unsigned
US us1=0;//正確,相當(dāng)于unsigned int
//US int us2;//錯(cuò)誤,無法正常使用
//注:因const、unsigned等并不是一種獨(dú)立的類型,故不便對(duì)它們重定義
//三、觀察新類型
//1.新類型的作用域
typedef int LTYPE;//定義局部類型LTYPE
void fun();//觀察LTYPE在fun中是否有效
fun();
//可見,用typedef定義的類型也有作用域之分。在函數(shù)內(nèi)用typedef定義的是局部類型
//typedef也可以像變量定義語句一樣放置在函數(shù)之外,這時(shí)定義的是全局類型
//2.新類型可否是已有類型
//typedef int float;//錯(cuò)誤,不能重定義標(biāo)準(zhǔn)類型
typedef int TYPE; //定義了新類型TYPE
//typedef char TYPE;//錯(cuò)誤,"TYPE重定義"
typedef int GTYPE;//正確,盡管GTYPE是已有類型,但它是本函數(shù)外定義的
//可見,新類型名必須是合法的標(biāo)識(shí)符,它在其作用域內(nèi)必須是唯一的
//4增加程序的可移植性(有利于程序在不同處理器、操作系統(tǒng)和編譯系統(tǒng)之間的移植)
/*例如,在TC下讀文件的程序段如下:
FILE* fp;
long buffer1;
fread(&buffer1,sizeof(long),1,fp);//每次讀出4個(gè)字節(jié)
若在VC下每次需要讀出8個(gè)字節(jié),程序需如下修改:
double buffer2;
fread(&buffer2,sizeof(double),1,fp);
現(xiàn)用typedef方法,程序段如下:
typedef long UNIT;//UNIT在TC中代表long,在VC中代表double
UNIT buffer;
fread(&buffer,sizeof(UNIT),1,fp);//每次讀出UNIT個(gè)字節(jié)
當(dāng)移植到VC下時(shí),只需改動(dòng)UNIT的定義即可:typedef double UNIT;*/
//二、typedef與define的區(qū)別
//用define也可實(shí)現(xiàn)簡單的類型替換,如
#define INT long //用INT來代替long
//兩種方式的區(qū)別如下:
//1.二者處理時(shí)間不同,宏替換是在預(yù)編譯時(shí)進(jìn)行的,而類型定義是在正式編譯時(shí)處理的
//2二者本質(zhì)不同,宏替換只是將宏名簡單替換為目標(biāo)字符串,而類型定義如同定義變量一樣
//是真的為程序增加了一種可用類型
//3.二者復(fù)雜性不同,用typedef可定義各種復(fù)雜的類型,并以各種方式使用新類型(詳見10_10_2.cpp)
//而define只能替換基本類型和自定義類型,無法替換派生類型,且使用起來很不安全,例如
#define pi int* //試圖用pi代替整型指針
pi pi1;//正確,展開后為int* pi1;
pi pi2,pi3;//錯(cuò)誤,原意是將pi2,pi3都定義成整型指針,但展開后為int* pi2,pi3; pi3并未定義成指針
#define NUM enum{one,two,three}//試圖用NUM代替該枚舉類型
NUM n1;//正確,定義了枚舉常量one,two,three和枚舉變量n1
//NUM n2;//錯(cuò)誤,展開后為enum{one,two,three}n2;從而造成枚舉常量one,two,three的重定義
#define DATE struct{int y,m,d;}
DATE *pd;//正確,定義了該結(jié)構(gòu)型指針
//pd=(DATE)1;//錯(cuò)誤,展開后為pi=(struct{int y,m,d;})1;目前尚不支持此種類型轉(zhuǎn)換寫法
#define TIME union{int h,m,s;}
//int L=sizeof(TIME);//錯(cuò)誤,展開后為int L=sizeof(union{int h,m,s;});sizeof操作數(shù)錯(cuò)誤
//可見,用define進(jìn)行類型替換時(shí),會(huì)產(chǎn)生各種意想不到的錯(cuò)誤,故應(yīng)避免使用,而改用安全的typedef