帶你解剖typedef之前,讓我們先來看看POSIX.1中對信號處理函數signal的原型說明:
--------------------------------------------------------------------------------
void (*signal(int sig, void (*func)(int)))(int);
--------------------------------------------------------------------------------
對於不熟悉C語言聲明的朋友,看到這樣的函數原型估計離崩潰不遠了,我們再來看看ANSI C中對此函數原型是作如何解釋的:
--------------------------------------------------------------------------------
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
--------------------------------------------------------------------------------
此處由於加了typedef自定義了一個新類型sighandler_t,所以第二行的函數原型看起來順眼多了,形式跟int func(char c, int i)無異,但是如果看不懂typedef語句,這兩句話仍然是噩夢。
要理解typedef,只要記住一句話就差不多了,那就是:typedef在語句中所起的作用只不過是把語句原先定義變量的功能變成了定義類型的功能而已。我們只消看幾個例子立即明白。
例如語句 typedef int *apple; 理解它的正確步驟是這樣的:先別看typedef,就剩下int *apple; 這個語句再簡單不過,就是聲明瞭一個指向整型變量的指針apple (注意:定義只是一種特殊的聲明),加上typedef之後就解釋成聲明瞭一種指向整型變量指針的類型apple 。
現在,回過來看上面的這個函數原型 typedef void (*sighandler_t)(int),蓋住 typedef不看 ,再簡單不過,sighandler_t就是一個函數指針,指向的函數接受一個整型參數並返回一個無類型指針 。加上typedef之後sighandler_t就是一種新的類型,就可以像int一樣地去用它,不同的是它聲明是一種函數指針,這種指針指向的函數接受一個整型參數並返回一個無類型指針 。怎麼樣?簡單吧。
再來做一個更酷的練習,請看:typedef char *(* c[10])(int **p);
去掉typedef就變成char *(* c[10])(int **p),先不管這個語句有多難看,它一定是聲明瞭一個擁有10個元素的數組c對不對?okay沒什麼了不起的,只不過這個數組c的元素有點特別,它們都是函數指針,並且它們所指向的這些函數統統都接受一個二級指針然後返回一直指向字符型的指針。加上typedef之後,c就不是一個數組了,而是一種類型了,什麼類型現在你能說出來了吧。 ^_^
說到typedef就不能不把它跟宏替換比較,typedef相對於宏替換是一種徹底的“替換”,#define之所以被稱爲宏替換,是因爲它就是簡單地照搬替換字符串。來看個例子:
例1 typedef int x[10];
例2 #define x int[10]
例1定義了類型x,此時我們就可以用它來定義別的變量了,比如x y; 此時y是一個擁有10個整型變量的數組,效果與語句int y[10]無異。typedef帶給我們的是一種徹底的封裝 。
例2用了宏定義的方式,將來在該宏的作用域範圍內的任何地方遇到的x都將被簡單地替換成int [10]。
(注意到,宏替換結尾是不帶分號的,不同於typedef語句)
對於typedef和宏可以有以下總結:
1、宏定義可以擴展,徹底封裝的typedef不可以。
--------------------------------------------------------------------------------
//以下代碼完全沒問題:
#define apple int;
unsigned apple i;
//以下代碼則完全行不通:
typedef int apple;
unsigned apple i;
--------------------------------------------------------------------------------
2、在連續聲明幾個變量的時候typedef可以完全保證變量是同一種類型,而宏替換無法保證。
--------------------------------------------------------------------------------
#define apple int *;
apple a, b; //a和b類型完全不同,a是指向整型變量的指針,b是整型變量。
typedef int *apple;
apple a, b; //a和b的類型完全相同,都是指向整型變量的指針。
--------------------------------------------------------------------------------
永遠要記住的是,typedef定義的是一種類型而不是變量,不能指望用它來定義一個變量。
發表於 @ 2009年08月28日 23:09:00 | 評論( 1 ) | 編輯| 舉報| 收藏
舊一篇:UNIX文件權限探討 | 新一篇:UNIX緩衝機制
查看最新精華文章 請訪問博客首頁相關文章
讀書筆記--typedef的有關指針聲明如何理解c和c++的複雜類型聲明typedef複習typedef與#define區別typedef用法詳解typedef由signal談起--typedef 指向函數的指針typedef 和#define定義別名的區別
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/seton040/archive/2009/08/28/4494986.aspx