介紹
typedef在c語言中主要是用來聲明數據類型的別名的,比如我們可以用來代替系統默認的類型名稱,數組、字符串、指針類型、字典等各種各樣的類型。當我們聲明了我們想要的別名后就可以使用我們聲明的別名來定義變量的類型。
四種常用的方式
一:基本數據類型
? ? //無符號整型
?? typedef unsigned int WMINT;
???WMINT i =0;
? ? //……
二:定義結構體
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;
三:字符串數組
? //字符串 ?oc
?? ?typedef NSString WMNSString;
?? ?WMNSString* string = [WMNSString stringWithFormat:@"”];
//數組 ?c
typedef int WMNewINT100 [100];
WMNewINT100 arr;
四:指針類型
typedef char*? WMChar;
WMChar charr =0;
注意事項:
一:
下面代碼有什么問題
typedef?char*?P;
int?strcmp(const?P,const?P);
在上面的代碼中,“const?P”?是否相當于?“const?char*”?呢?
答案是否定的,原因很簡單,typedef?是用來定義一種類型的新別名的,它不同于宏,不是簡單的字符串替換。因此,“const?P”中的?const?給予了整個指針本身常量性,也就是形成了常量指針“char*const(一個指向char的常量指針)”。即它實際上相當于“char*const”,而不是“const?char*(指向常量?char?的指針)”。當然,要想讓?const?P 相當于?const?char*?也很容易,如下面的代碼所示:
typedef?const?char*?P;
int?strcmp(P,?P);
其實,無論什么時候,只要為指針聲明?typedef,那么就應該在最終的?typedef?名稱中加一個?const,以使得該指針本身是常量。
二、
還需要特別注意的是,雖然?typedef?并不真正影響對象的存儲特性,但在語法上它還是一個存儲類的關鍵字,就像?auto、extern、static?和?register?等關鍵字一樣。因此,像下面這種聲明方式是不可行的:
typedef?static?int?INT_STATIC;
不可行的原因是不能聲明多個存儲類關鍵字,由于?typedef?已經占據了存儲類關鍵字的位置,因此,在?typedef?聲明中就不能夠再使用?static?或任何其他存儲類關鍵字了。當然,編譯器也會報錯,如在?VC++2010?中的報錯信息為“無法指定多個存儲類”。