標籤:
1、區別
(1)定義、執行時間、範圍
定義、執行時間:
#define pchar char *typedef char *pchar;
定義的格式差別,顯而易見的,要注意,define 是不能存在分號的(文本替換),而typedef 是存在逗號的(類型的重新命名)。
同時,define 由前置處理器進行處理,只做簡單的文本替換的工作,不做任何檢查(正確性檢查、範圍檢查、類型檢查)
typedef 是給一個已經存在類型的別名,在編譯時間候處理。
範圍:
define 只要一次定義,那麼就 沒有範圍的限制,在哪都可以被使用:
void func1() { #define HW "HelloWorld"; } void func2() { string str = HW; cout << str << endl; }
typedef 則不然,存在自己的範圍。
void func1() { typedef unsigned int UINT; } void func2() { UINT uValue = 5;//error C2065: ‘UINT‘ : undeclared identifier }
(2)對指標的操作
#define pint int*typedef int* ppint;pint a1, b1;ppint c1, d1;
上面的定義等價於
int * a1;int b1;int * c1;int * d1;
對於處於定義指標的方式來說,還是使用 typedef 靠譜。
2、typedef 與 const 的結合
當:
typedef int * pint;int a = 1;const pint p1 = &a;*p1 = 2;cout << *p1 << endl;
列印的結果是: 2
可見: const pint p1; 是相當於 int * const p1,也就是 p1 是const 指標,p1 指向地址是常量(不能改變),所以定義的時候就需要被初始化,但是p1 所知的內容是可以被修改的,修改變為 2 列印輸出。
可見,即使是換了順序,都是相當於: int * const p1; 也就是不論順序是怎麼挑換都是一個定義 const 指標。
typedef int * pint;int a = 1;pint const p1 = &a;*p1 = 2;cout << *p1 << endl;列印: 2
如果非要定義出一個 const int * 類型的話,只能:
typedef const int * cpint;
只有這個方法定義出來的才是,才可以定義出一個指向 const 的指標。
3、typedef 作用(1)簡化複雜的類型說明
int(*pfunc)(int,int)使用typedef:typedef int(*pfunc)(int,int)使用: pfunc ptr = 函數名;
(2)定義與平台無關的類型
資料類型的定義,一般都是與平台有關的。對於大型的代碼的時候,如果定義的都是:long double a; 但是當平台不支援 long long 類型的時候,要進入代碼體一個個尋找,那真是要命:
typedef long double REAL;
在跨平台的時候,只需要修改一次就全部解決了。
4、封裝程度不一樣
typedef 和 define 在縫紮un個程度是是不一樣的。typedef 可以看成是一種徹底的“封裝” 類型,也就是說,在對 typedef 聲明之後,就不能再往裡面添加別的東西了。而 define 則不然,他只是文本替換工作而已,所以聲明之後還是可以進行封裝的。
#define zhengxing1 intunsigned zhengxing1 i;
編譯器正確通過。
typedef int zhengxing2;unsigned zhengxing2 j;
編譯器是編譯不過的。
typedef 與 define 的區別