使用的場合有以下三種:
1) 定義一種類型的別名,屬於編譯過程的一部分,並不實際分配內存空間。
在這種使用場景下,typedef與define的作用相同;而不同點在於define聲明的類型別名,只是一個簡單的宏替換。
如:
char* pa, pb;
typedef char* PCHAR;
#define PCHAR2 char*;
PCHAR s1, s2;
PCHAR2 s3, s4;
typedef int ARRAY[10];
typedef int(*PF)(void);
ARRAY m1;
定義的pa, s1, s2, s3 是一個指向字符變量的指針,pb,s4 是一個字符變量。
原因就在於#define只是簡單的字符串替換,而typedef則是爲一個類型起了一個別名。
Array是一個int[10]的別名,因此,m1是一個包含10個元素的int類型的數組。而PF是一個指向不帶任何參數,返回值爲int類型的函數指針。
2) 由於在以前的C代碼中,聲明struct新對象時,必須要帶上struct,即:
struct 結構名 對象名;
而在C++中,則可以直接使用:
結構名 對象名;
爲了少寫一個struct對象,因此有了這樣的寫法:
typedef struct tagPoint{
int x;
int y;
}POINT;
POINT p1;
3)用typedef 來定義與平臺無關的類型。
使用陷阱:
陷阱一:
記住:typedef 定義了一種類型的別名。
以下那句編譯會出錯。
typedef char* PSTR;
char string[4] = "abc";
const char* p1 = string;
const PSTR p2 = string;
p1++;
p2++;
備註:p2++出錯, 原因在於,typedef不是簡單的宏替換,const PSTR p2 並不等於const char* p2
而是等於char* const p2;即定義了一個指向字符的常量指針,p2爲只讀不能進行任何修改。
陷阱二:
typedef 在語法上是一個存儲類的關鍵字,和如auto,extern,mutable,static,register等一樣,雖然實際上它並不影響對象存儲的特性,
但是它不能上面列出來的存儲類關鍵字一同使用作用在變量上。否則編譯器會提示“指定了一個以上的存儲類”。