首先請看看下面這兩句:
typedef int a[10];
typedef void (*p)(void);
如果你能一眼就看出它們的意思,那請不要再往下看了。如果你不太理解,或概念還有些模糊,請繼續往下看吧。
typedef用來宣告乙個別名,typedef後面的語法,是乙個宣告。本來這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹typedef的時候通常會寫出如下形式:
typedef int para;
這種形式跟#define int para幾乎一樣!這些教材的宗旨是由淺入深,但實際做出來的行為卻是以偏蓋全!
的確,這種形式在所有形式中是最簡單的,但卻沒有對 typedef進一步解釋,使得不少人用#define的思維來看待typedef,把int與para分開來看,int是一部分,para是另一部分,但實際上根本就不是這麼一回事。int與para是乙個整體!就象int i:宣告一樣是乙個整體宣告,只不過int i定義了乙個變數,而typedef定義了乙個別名。
typedef int a[10];
typedef void (*p)(void);
會以為a[10]是int的別名,(*p)(void)是void的別名,但這樣的別名看起來又似乎不是合法的名字,於是陷入困惑之中。實際上,上面的語句把a宣告為具有10個int元素的陣列的型別別名,p是一種函式指標的型別別名。
雖然在功能上,typedef可以看作乙個跟int para分離的動作,但語法上typedef屬於儲存類宣告說明符,因此嚴格來說,typedef int para整個是乙個完整的宣告。
定義乙個函式指標型別。比如原函式是:
void func(void);
那麼定義的函式指標型別就是:
typedef void (*fun)(void);
然後用此型別生成乙個指向函式的指標:
fun func1;
func1(void);
下面是理解typedef的正確方法,分為以下幾步:
1. 確定被宣告的型別:遇到typedef時,從左到右進行掃瞄,找到第乙個「陌生」的標誌符,這個標誌符就應該是語句所宣告的型別名稱。例如:
typedef int* (* pt)(int* (*pn)(int * p1,int *p2),int * p3);
typedef int * (*pt)(int * (*)(int *, int *),int *);
2. 之後一旦遇到該型別宣告的變數,則在該型別的typedef式中用變數代替型別,去掉typedef關鍵字,所得到的宣告式等價與原來的宣告。例如:
pt p;
這個宣告式,可以經過兩步變化為等價的宣告式。
首先,回到pt的typedef式:
typedef int * (*pt)(int * (*)(int *, int *),int *);
用p代替pt:
typedef int * (*p)(int * (*)(int *, int *),int *);
然後把typedef去掉,得到:
int * (*p)(int * (*)(int *, int *),int *);
這個語句與 pt p;意義相同。
如果基礎紮實,應該知道,這是個函式指標的宣告,所指向的函式有兩個int * 引數,返回乙個int *值,第二個引數是int * ,整個函式返回乙個int *。
typedef和define的區別
typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。
1. 首先,二者執行時間不同
關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。
define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查。
#define用法例子:
#define f(x) x*x
main( )
程式的輸出結果是: 36,根本原因就在於#define只是簡單的字串替換。
2. 功能不同
typedef用來定義型別的別名,這些型別不只包含內部型別(int,char等),還包括自定義型別(如struct),可以起到使型別易於記憶的功能。
如:
typedef int (*pf) (const char *, const char *);
定義乙個指向函式的指標的資料型別pf,其中函式返回值為int,引數為const char *。
typedef 有另外乙個重要的用途,那就是定義機器無關的型別,例如,你可以定義乙個叫 real 的浮點型別,在目標機器上它可以i獲得最高的精度:
typedef long double real;
在不支援 long double 的機器上,該 typedef 看起來會是下面這樣:
typedef double real;
並且,在連 double 都不支援的機器上,該 typedef 看起來會是這樣:
typedef float real;
#define不只是可以為型別取別名,還可以定義常量、變數、編譯開關等。
3. 作用域不同
#define沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用。
而typedef有自己的作用域。
void fun()
void gun()
4. 對指標的操作
二者修飾指標型別時,作用不同。
typedef int *pint;
#define pint int *
const pint p;//p不可更改,p指向的內容可以更改,相當於int * const p;
const pint p;
//p可以更改,p指向的內容不能更改,相當於 const int *p;或 int const *p;
pint s1, s2;//s1和s2都是int型指標
pint s3, s4;
//相當於int * s3,s4;只有乙個是指標
深入理解typedef
深入理解typedef 關於typedef的用法,網上已經有很多前輩總結過了,在這裡我不想標新立異,閱歷不一樣,所理解的typedef的層次各有不同。這裡,我想就我所理解的typedef用更加通俗易懂的方式寫出來。在開始之前,要始終牢記 typedef的本質是取乙個別名 先從簡單的說起 這裡,typ...
深入理解typedef
typedef作為型別定義關鍵字,用於在原有資料型別 包括基本型別 構造型別和指標等 的基礎上,由使用者自定義新的型別名稱。在程式設計中使用typedef的好處,除了為變數取乙個簡單易記且意義明確的新名稱之外,還可以簡化一些比較複雜的型別宣告。比如 typedef int int32 將int32定...
深入理解typedef
typedef作為型別定義關鍵字,用於在原有資料型別 包括基本型別 構造型別和指標等 的基礎上,由使用者自定義新的型別名稱。在程式設計中使用 typedef 的好處,除了為變數取乙個簡單易記且意義明確的新名稱之外,還可以簡化一些比較複雜的型別宣告。比如 typedef int int32 將int3...