C/C++ typedef 溫習

typedef 作用:用來聲明一個別名。

使用的場合有以下三種:
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等一樣,雖然實際上它並不影響對象存儲的特性,
但是它不能上面列出來的存儲類關鍵字一同使用作用在變量上。否則編譯器會提示“指定了一個以上的存儲類”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章