https://blog.csdn.net/andrewniu/article/details/80566324
第一趋急、四個用途
用途一:
定義一種類型的別名碟联,而不只是簡單的宏替換妒御≈讣澹可以用作同時聲明指針型的多個對象训唱。比如:
char* pa, pb; // 這多數(shù)不符合我們的意圖刽虹,它只聲明了一個指向字符變量的指針,
// 和一個字符變量拔创;
以下則可行:
typedef char* PCHAR; // 一般用大寫
PCHAR pa, pb; // 可行利诺,同時聲明了兩個指向字符變量的指針
雖然:
char *pa, *pb;
也可行,但相對來說沒有用typedef的形式直觀剩燥,尤其在需要大量指針的地方慢逾,typedef的方式更省事立倍。
用途二:
用在舊的C的代碼中(具體多舊沒有查),幫助struct侣滩。以前的代碼中口注,聲明struct新對象時,必須要帶上struct君珠,即形式為: struct 結(jié)構(gòu)名 對象名寝志,如:
[cpp]view plaincopy
struct?tagPOINT1??
{??
int?x;??
int?y;??
};??
struct?tagPOINT1?p1;???
而在C++中,則可以直接寫:結(jié)構(gòu)名 對象名策添,即:
tagPOINT1 p1;
估計某人覺得經(jīng)常多寫一個struct太麻煩了材部,于是就發(fā)明了:
[cpp]view plaincopy
typedef?struct?tagPOINT??
{??
int?x;??
int?y;??
}POINT;??
POINT?p1;//?這樣就比原來的方式少寫了一個struct,比較省事唯竹,尤其在大量使用的時候??
或許乐导,在C++中,typedef的這種用途二不是很大浸颓,但是理解了它物臂,對掌握以前的舊代碼還是有幫助的,畢竟我們在項目中有可能會遇到較早些年代遺留下來的代碼产上。
第三棵磷、typedef 與 #define的區(qū)別
案例一:
通常講,typedef要比#define要好蒂秘,特別是在有指針的場合泽本。請看例子:
[cpp]view plaincopy
typedef?char?*pStr1;??
#define?pStr2?char?*;??
pStr1?s1,?s2;??
pStr2?s3,?s4;??
在上述的變量定義中淘太,s1姻僧、s2、s3都被定義為char *蒲牧,而s4則定義成了char撇贺,不是我們所預(yù)期的指針變量,根本原因就在于#define只是簡單的字符串替換而typedef則是為一個類型起新名字冰抢。
案例二:
下面的代碼中編譯器會報一個錯誤松嘶,你知道是哪個語句錯了嗎?
[cpp]view plaincopy
typedef?char?*?pStr;??
char?string[4]?=?"abc";??
const?char?*p1?=?string;??
const?pStr?p2?=?string;??
p1++;??
p2++;??
是p2++出錯了挎扰。這個問題再一次提醒我們:typedef和#define不同翠订,它不是簡單的文本替換。上述代碼中const pStr p2并不等于const char * p2遵倦。const pStr p2和const long x本質(zhì)上沒有區(qū)別尽超,都是對變量進(jìn)行只讀限制,只不過此處變量p2的數(shù)據(jù)類型是我們自己定義的而不是系統(tǒng)固有類型而已梧躺。因此似谁,const pStr p2的含義是:限定數(shù)據(jù)類型為char *的變量p2為只讀,因此p2++錯誤。