四個用途
- 定義一種類型的別名,而不是簡單的宏替換
- 定義struct新對象的別名
- 定義和平台無關的類型
- 為復雜聲明定義一個簡單的別名
typedef char* PCHAR; // 一般用大寫
PCHAR pa, pb; // 可行,同時聲明了兩個指向字符變量的指針
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 這樣就比原來的方式少寫了一個struct,比較省事,尤其在大量使用的時候
typedef long double REAL;
//在不支持 long double 的平台二上,改為:
typedef double REAL;
//在連 double 都不支持的平台三上,改為:
typedef float REAL;
//也就是說,當跨平台時,只要改下 typedef 本身就行,不用對其他源碼做任何修改。
兩大陷阱
- typedef定義了一種類型的新別名,不同於宏,不是簡單的字符串替換
先定義:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR實際上相當於const char* 嗎?
不是的,它實際上相當於char * const。
原因在於const給予了整個指針本身以常量性,也就是形成了常量指針char* const。
簡單來說,記住當const和typedef一起出現時,typedef不會是簡單的字符串替換就行。
- typedef在語法上是一個存儲類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它並不真正影響對象的存儲特性
如:
typedef static int INT2; //不可行
編譯將失敗,會提示“指定了一個以上的存儲類”。