typedef的文法描述:
在現實生活中,資訊的概念可能是長度,數量和面積等。在C++語言中,資訊被抽象為int、float和 double等基本資料類型。從基本資料類型名稱上,不能夠看出其所代表的實體屬性,并且int、float和double為系統關鍵字,不可以修改。為了解決使用者自定義資料類型名稱的需求,C++語言中引入類型重定義語句typedef,可以為資料類型定義新的類型名稱,進而豐富資料類型所包含的屬性資訊。
typedef的定義
typedef 類型名稱類型辨別符; 如 typedef int LENGTH;
可使用LENGTH 定義變量; 如 LENGTH c;
typedef 的主要應用形式:
1、 為基本資料類型定義新的類型名、定義與平台無關的類型。舉例如上
2、 為自定義資料類型(結構體、公用體和枚舉類型)定義簡潔的類型名稱。
舉例:typedef struct { int x;}Point; 可用Point 來聲明結構體;
3、 為數組定義簡潔的類型名稱。
舉例:typedef int array_10 [10]; 可使用 array_10 a;a為int數組,10個元素
4、 為指針定義簡潔的名稱//普通指針、函數指針
typedef int(*MyFun)(int a,int b); 可使用MyFun聲明函數指針、MyFun p;
int Max(int a,int b); p=Max;
5、 為複雜聲明定義新的簡單别名。
舉例1:原始:int *(*a[5])(int ,char*); 變量名為a;
使用typedef int *(*p)(int ,char*); p a[5]即可
舉例2:原始:void (*b[10])(void (*)()); 分兩步替換即可。先替換右側括号中的。
typedefvoid(*pFun1)();
typedefvoid(*pFun2)(pFun1); pFun2 b[10]即可
舉例3:原始:double (*)()(*e)[9]; 分兩步替換即可。
typedef double(*p);
typedef p(*pFun1)[9]; pFun1 e;即可
了解複雜聲明可用的“右左法則”;從變量名看起,先往右,再往左,碰到一個圓括号就 調整閱讀的方向,括号内分析完就跳出括号,依然先右後左的順序,如此循環到結束。
舉例:int (*func[5])(int *); func 右邊是一個[]運算符,表明func是具有5個元素的數 組,左邊有* ,表明func的元素是指針,[]運算符優先級比*高,func先跟[]結合).
Func數組的元素是函數類型的指針,它指向的函數具有int *類型的形參。
兩個模式:
typedef (*)(…) 函數指針
typedef (*)[] 數組指針
在c++類中使用函數指針:
typedef 傳回類型(類名::*新類型)(參數表);使用類成員函數必須有”->*”或者“.*”
需要注意的問題:
1、 typedef不建立新類型,隻是為已有類型建立一個新名稱。
2、 它隻适用于類型名稱定義,不适應于變量定義。
3、 與#define可達到相同效果,但實質不同。#define主要定義常量,此常量可以為任何的字元及其組合,在編譯之前,将此常量出現的所有位置,用其代表的字元或字元組合無條件的替換,然後進行編譯。typedef是為已知資料類型增加一個新名稱,其原理與使用int 、double等保留字一緻。
typedef和define具體的詳細差別:
1、#define是預處理指令,在編譯預處理時進行簡單的替換,不作正确性檢查,不關含義是否正确照樣帶入,隻有在編譯已被展開的源程式時才會發現可能的錯誤并報錯。例如: #define PI 3.1415926 程式中的:area=PI*r*r 會替換為3.1415926*r*r 如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
2、typedef是在編譯時處理的。它在自己的作用域内給一個已經存在的類型一個别名。
3、typedef int * int_ptr與 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說,#define在預處理時進行簡單的替換,而typedef不是簡單替換,而是采用如同定義變量的方法那樣來聲明一種類型。舉例:t
ypedef int* pint;
#definePINT int*
const pint p;//p不可更改。但p指向的内容可更改。
const PINTp;//p可更改,但是p指向的内容不可更改。
陷阱:
1、typedef是定義了一種類型的新别名,不同于宏,它不是簡單的字元串替換。
typedef char *PSTR; int fun(const PSTR,const PSTR);
const PSTR 不是const char *; 而是 char * const;
2、typedef在文法上是一個存儲類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它并不真正影響對象的存儲特性,如typedef static int INT2;//不可行