介紹
typedef在c語言中主要是用來聲明數(shù)據(jù)類型的別名的,比如我們可以用來代替系統(tǒng)默認(rèn)的類型名稱翼馆,數(shù)組割以、字符串、指針類型应媚、字典等各種各樣的類型严沥。當(dāng)我們聲明了我們想要的別名后就可以使用我們聲明的別名來定義變量的類型。
四種常用的方式
一:基本數(shù)據(jù)類型
? ? //無符號(hào)整型
?? typedef unsigned int WMINT;
???WMINT i =0;
? ? //……
二:定義結(jié)構(gòu)體
A中姜、普通未聲明的寫法
struct point{
???int x;
???int y;
???int z;
};
struct pointp = {1,2,3};
B消玄、聲明后的寫法
typedef struct point2 { ? ? ? ? ? ?
???int a;
???int b;
???int c;
} P;
P s = {2,2,2};
或者
struct point2 { ? ? ? ? ? ?
???int a;
???int b;
???int c;
};
typedef point2?P2;
P2 s2 ={2,2,2};
Oc枚舉
typedef NS_ENUM(NSInteger, WMNetWorkType) {
? ? Unknown????????? = -1,
? ? NotReachable ??? =0,
? ? ReachableViaWWAN =1,
? ? ReachableViaWiFi =2,
};
WMNetWorkType network =Unknown;
三:字符串?dāng)?shù)組
? //字符串 ?oc
?? ?typedef NSString WMNSString;
?? ?WMNSString* string = [WMNSString stringWithFormat:@"”];
//數(shù)組 ?c
typedef int WMNewINT100 [100];
WMNewINT100 arr;
四:指針類型
typedef char*? WMChar;
WMChar charr =0;
注意事項(xiàng):
一:
下面代碼有什么問題
typedef?char*?P;
int?strcmp(const?P,const?P);
在上面的代碼中,“const?P”?是否相當(dāng)于?“const?char*”?呢丢胚?
答案是否定的翩瓜,原因很簡單,typedef?是用來定義一種類型的新別名的携龟,它不同于宏兔跌,不是簡單的字符串替換。因此峡蟋,“const?P”中的?const?給予了整個(gè)指針本身常量性坟桅,也就是形成了常量指針“char*const(一個(gè)指向char的常量指針)”。即它實(shí)際上相當(dāng)于“char*const”蕊蝗,而不是“const?char*(指向常量?char?的指針)”仅乓。當(dāng)然,要想讓?const?P 相當(dāng)于?const?char*?也很容易蓬戚,如下面的代碼所示:
typedef?const?char*?P;
int?strcmp(P夸楣,?P);
其實(shí),無論什么時(shí)候子漩,只要為指針聲明?typedef裕偿,那么就應(yīng)該在最終的?typedef?名稱中加一個(gè)?const,以使得該指針本身是常量痛单。
二嘿棘、
還需要特別注意的是,雖然?typedef?并不真正影響對(duì)象的存儲(chǔ)特性旭绒,但在語法上它還是一個(gè)存儲(chǔ)類的關(guān)鍵字鸟妙,就像?auto焦人、extern、static?和?register?等關(guān)鍵字一樣重父。因此花椭,像下面這種聲明方式是不可行的:
typedef?static?int?INT_STATIC;
不可行的原因是不能聲明多個(gè)存儲(chǔ)類關(guān)鍵字,由于?typedef?已經(jīng)占據(jù)了存儲(chǔ)類關(guān)鍵字的位置房午,因此矿辽,在?typedef?聲明中就不能夠再使用?static?或任何其他存儲(chǔ)類關(guān)鍵字了。當(dāng)然郭厌,編譯器也會(huì)報(bào)錯(cuò)袋倔,如在?VC++2010?中的報(bào)錯(cuò)信息為“無法指定多個(gè)存儲(chǔ)類”。