天天看點

typedef深入了解,不要被教材忽悠

首先請看看下面這兩句: 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擷取函數位址之後,那麼你就可以向調用原函數那樣來使用這個函數指針: func1(void);