1.typedef的用途
1)定義一種類型的別名
注意typedef並不是簡單的宏替換,如下例所示:
int main() { char *pa,pb;//聲明了一個指向字符變量的指針pa,和一個字符變量pb pa = "hello"; pb = "hello";//報錯,不能將const char*類型的值賦給char類型的實體 pb = 'h';//正常 return 0; }
再看以下示例:
int main() { typedef char* PCHAR; PCHAR pa,pb; pa = "hello"; pb = "hello";//正常 pb = 'h';//報錯,不能將char類型的值賦給PCHAR類型實體 return 0; }
可以看出,typedef char* PCHAR;之后,PCHAR是char*類型的別名,
PCHAR pa,pb;將pa,pb都定義成char*類型。
2)定義struct結構體別名
我們知道,當聲明一個結構體對象時,必須要帶上struct,
格式為:struct 結構體名 對象名;
如下例所示:
struct tagPOINT1 { int x; int y; }; struct tagPOINT1 p1;
當我們用typedef定義struct的別名后,可以直接用別名 對象名來聲明一個對象。
如下例所示:
typedef struct tagPOINT1 { int x; int y; }POINT; POINT p1;
3)用typedef來定義與平台無關的類型。
比如,某一平台支持int類型,而不支持long類型。
則可以使用typedef定義一個支持類型的別名,程序中使用該別名聲明變量。
這樣,我們使用極小的修改,typedef int REAL;就可以實現類型的平台無關性。
標准庫中廣泛使用了這個技巧。
4)為復雜的聲明定義一個簡單的別名
如:typedef int (*A) (char, char);
A是我們定義的別名,表示的是一個指向函數的指針,
該函數有兩個char類型的參數,返回一個int類型的值。
則A類型的對象可以指向任何符合上述規則的函數。
如下例所示:
#include<iostream> using namespace std; typedef int (*A)(char,char); int fun0(char a,char b); int fun1(char a,char b); int main() { A a; a = fun0; a('a','b'); a = fun1; a('a','b'); return 0; } int fun0(char a,char b) { cout<<"fun0"<<endl; return 0; } int fun1(char a,char b) { cout<<"fun1"<<endl; return 0; }
輸出結果:
fun0
fun1
2.typedef和#define的區別
由前面的講解,我們知道typedef和#define有本質的區別。
typedef是一種類型別名,而#define只是宏定義。二者並不總是可以互換的。
如下例所示:
typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2; pStr2 s3, s4;
其中s1, s2, s3是char*類型,而s4是char類型。
3.typedef需要注意的事項。
我們看一下下面的示例:
typedef char* pStr; const char* p1 = "hello"; const pStr p2 = "hello"; p1++;//正常 p2++;//報錯
p1和p2都是常量指針,意思是指針指向的內容不能修改,而指針是可以修改的。
那為什么p1++正常,而p2++報錯呢。
對於p1++,我們不用再解釋了,因為常量指針是可變的。
而p2是我們定義的別名,而不是系統固有類型,編譯器在編譯時,會認為p2是常量,不可修改,
所以p2++會報錯。